POJ: 1002 487-3279

先放题目地址:http://poj.org/problem?id=1002

  • 题目思路:每行读入之后,根据某种方式将其全部转化为数字,以“xxx-xxxx”的格式存储入表,经过判断后,以 key+value 的形式输出,如果没有重复就单独考虑。

这个思路其实很简单。。(我当时甚至还好奇为啥Ac率这么低)所以我很快就写出了第一版的代码:用replace()处理输入数据,存入hashMap,经过排序后输出

第一次提交的时候报的是WA,因为题目中的No duplicates.我忘记写进去了(审题的时候有注意到,真正写的时候却忘记了,以后要多加注意)

修改后,第二次提交竟然给我报了Time Limit Exceeded,菜鸡做题少,第一次见这样报错,有点沮丧,请老爸帮看了一下,经验丰富的他觉得问题出在replace()上(有机会去看看原码实现,看了回来更新一下)

第二天,我将translate()方法中的生成串的方式改成了str = str + "x",(但此时没有修改最开始的line = line.replace("-",""),为持续的TLE埋下伏笔)

修改后,依旧是TLE,在csdn上搜了一下,看到其他大神使用了TreeMap<>,会不会是排序导致不够快呢?我也写了一个TreeMap的版本(后来仔细思考一下,这样想并不靠谱,Collections.sort();被内置,肯定经过了相当优化,不会慢的)

这次还是没有找到错误的根源,依旧TLE,再次研究大佬代码,发现了处理输入中大量“-”的方法:使用的是+(StringBuilder大概也行):在生成判断时再略过"-"而不是一开始就简单粗暴的用replace()

将所有的replace()改掉之后,终于AC了,后来重新使用了之前的写法,不用TreeMap也过了

HashMap<String,Integer> myMap = new HashMap<String ,Integer>();
...
Collection<String> keyset = myMap.keySet();
List<String> list = new ArrayList<String>(keyset);
Collections.sort(list);

果然,全都是replace()的错。提交了六次,终于搞定了。。。

  • 做本题时收获的细微知识点
  1. replace()replaceAll()的区别:后者支持正则而前者不支持
  2. TreeMap<>是一种自带排序的Map集合类

TreeMap是基于红黑树(一种自平衡的二叉查找树)实现的一个保证有序性的Map

  1. StringBuilder的一些使用(当时用于插入"-"以构成"xxx-xxxx"的格式),隐约记得67大帝说它比"+"更快
  2. 引入了字典表的概念(虽然最后没有使用)
  • 代码:(包括了一些注释和心路历程,和一些导致多次提交的小错误)
import java.util.*;
//第一次提交:WA 忘记考虑No duplicates.
//第二次提交:超时惹 似乎是因为replace太慢了
//第三次提交:还在超时 这次似乎是因为把HashMap的key单独成list再拿回去遍历太慢了
//第四次提交:依旧超时 replace的问题?
//第五次提交:编译报错,虽然已经发现了replace问题,但不小心搞错了n和list.size()的关系,list.size()只算独一无二的,n则是所有输出
//第六次提交:AC了,replace属实不行,一个都不能有
  //无论是用TreeMap还是用第三次提交的方法都可以,不replace就可以!
public class Main {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        input.nextLine();
//        Map<String,Integer> myMap = new TreeMap<String, Integer>(); //使用TreeMap同样通过
        HashMap<String,Integer> myMap = new HashMap<String ,Integer>();

//        HashMap<String,String> mydictMap = new HashMap<String,String>(); //
//        initDictMap(dictMap);

        for(int i=0;i<n;i++){
            String outcome = translate(input.nextLine());
            if(myMap.get(outcome) == null){
                myMap.put(outcome,1);
            }else {
                myMap.put(outcome,myMap.get(outcome)+1);
            }
        }
        Collection<String> keyset = myMap.keySet();
        List<String> list = new ArrayList<String>(keyset);
        Collections.sort(list);
        //开始输出
//        Set keyset = myMap.keySet();
//        Iterator it = keyset.iterator();
        boolean noDup = true;
//        System.out.println(n+" "+list.size()); //检测语句!!!
        for(int i=0;i<list.size();i++){
            if(myMap.get(list.get(i)) != 1){
                noDup = false;
                String str = list.get(i);
//                StringBuilder sb = new StringBuilder(str);
//                sb.insert(3,"-");
//                str = sb.toString();
//                str = str.substring(0,3) + "-" + str.substring(3);
                System.out.println( str+ " " + myMap.get(list.get(i)));
            }
        }
//        while(it.hasNext()){
//            String str = it.next().toString();
//            int value = myMap.get(str);
//            if(value > 1){
//                noDup = false;
//                System.out.println(str + " " + value);
//            }
//        }
        if(noDup == true){
            System.out.println("No duplicates.");
        }
    }

    // 爸爸看了一下代码,速度慢在 replace 这个动作上,建议改为新建一个 outline (String outline = null),然后根据判断把转换出来的数字加进去(比如:outline = outline+"2")
    // 关于判断,爸爸有个更简单明了的方法,就是先建立一个hashmap,保存对应关系,然后你直接 map.get(line.charAt(i)),就是转换出来的值
    // 比如: HashMap<String,String> dictMap = new HashMap<String ,String>();
    // 然后: dictMap.put("A","2"); dictMap.put("B","2"); dictMap.put("C","2"); dictMap.put("D","3"); ....... dictMap.put("0","0"); dictMap.put("-",""); .......
    // 这样你得到的就是全数字输出,中间是没有插入 "-" 字符的;排序之后,在输出的时候,再把这个 "-" 加进去

    public static void initDictMap(HashMap<String,String> dictMap){
        // 初始化字典表
    }

//dictMap.get(ine.charAt(i))

    public static String translate(String line){
//        line = line.replace("-","");
        String str = "";
//测试一下替换结果,因为不确定长度到底是多少,担心后续下标取错
//        System.out.println(line + " " + line.length());
        for(int i=0;i<line.length();i++){
//            if(line.charAt(i)<'0' || line.charAt(i)>'9'){ //编译器似乎不支持switch,那就用if了
                if(line.charAt(i)=='A' || line.charAt(i)=='B' || line.charAt(i)=='C'){ //个人认为这里使用ASCII可以有简化计算,但Q和Z无映射,可以之后试试写
                    str = str + "2";
//                    line = line.replace(String.valueOf(line.charAt(i)),"2");
                }else if(line.charAt(i)=='D' || line.charAt(i)=='E' || line.charAt(i)=='F'){
                    str = str + "3";
//                    line = line.replace(String.valueOf(line.charAt(i)),"3");
                }else if(line.charAt(i)=='G' || line.charAt(i)=='H' || line.charAt(i)=='I'){
                    str = str + "4";
//                    line = line.replace(String.valueOf(line.charAt(i)),"4");
                }else if(line.charAt(i)=='J' || line.charAt(i)=='K' || line.charAt(i)=='L'){
                    str = str + "5";
//                    line = line.replace(String.valueOf(line.charAt(i)),"5");
                }else if(line.charAt(i)=='M' || line.charAt(i)=='N' || line.charAt(i)=='O'){
                    str = str + "6";
//                    line = line.replace(String.valueOf(line.charAt(i)),"6");
                }else if(line.charAt(i)=='P' || line.charAt(i)=='R' || line.charAt(i)=='S'){
                    str = str + "7";
//                    line = line.replace(String.valueOf(line.charAt(i)),"7");
                }else if(line.charAt(i)=='T' || line.charAt(i)=='U' || line.charAt(i)=='V'){
                    str = str + "8";
//                    line = line.replace(String.valueOf(line.charAt(i)),"8");
                }else if(line.charAt(i)=='W' || line.charAt(i)=='X' || line.charAt(i)=='Y'){
                    str = str + "9";
//                    line = line.replace(String.valueOf(line.charAt(i)),"9");
                }else if(line.charAt(i)=='-'){
                }else {
                    str = str + String.valueOf(line.charAt(i));
                }

//            }
        }
        str = str.substring(0,3) + "-" + str.substring(3);
//        System.out.println(str);
        return str;
    }
}
  • 参考:
  1. TreeMap的介绍:https://blog.csdn.net/qq_42253147/article/details/90452828
  2. 其他大佬的解题报告:https://blog.csdn.net/weixin_38898747/article/details/90690766
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352