1002_Java

作者: 李小佛 | 来源:发表于2019-06-18 14:56 被阅读0次

    Input
    输入的格式是,第一行是一个正整数,指定电话号码薄中号码的数量(最多100000)。余下的每行是一个电话号码。每个电话号码由数字,大写字母(除了Q和Z)以及连接符组成。每个电话号码中只会刚好有7个数字或者字母。

    Output
    对于每个出现重复的号码产生一行输出,输出是号码的标准格式紧跟一个空格然后是它的重复次数。如果存在多个重复的号码,则按照号码的字典升序输出。如果输入数据中没有重复的号码,输出一行: "No duplicates. "

    解题思路:
    1、不需要判断输入内容的格式(系统测试算法时使用的数据都是符合输入格式的数据)
    2、输入的内容先进行格式化(字母替换成数字,去掉输入的横线“-”,再在index=3处插入横线“-”)
    3、将格式化后的内容插入到一个TreeMap(TreeMap 默认排序规则:按照key的字典顺序来排序(升序))中
    4、遍历输出TreeMap元素

    难点:
    在多次提交中一直提示“Time Limit Exceeded”,排查原因是在循环中使用了String的replace方法,该方法比较耗时,在数据量大时表现特别明显(这道题目,系统测试算法时,应该使用的上万条数据)。

    难点解决方案:
    使用StringBuilder替换replace

    import java.util.*;
    
    public class Main {
        private static HashMap<Character, Character> dict = new HashMap<Character, Character>() {
            {
                put('A', '2');
                put('B', '2');
                put('C', '2');
                put('D', '3');
                put('E', '3');
                put('F', '3');
                put('G', '4');
                put('H', '4');
                put('I', '4');
                put('J', '5');
                put('K', '5');
                put('L', '5');
                put('M', '6');
                put('N', '6');
                put('O', '6');
                put('P', '7');
                put('R', '7');
                put('S', '7');
                put('T', '8');
                put('U', '8');
                put('V', '8');
                put('W', '9');
                put('X', '9');
                put('Y', '9');
            }
        };
    
        public static void main(String args[]) {
            TreeMap<String, Integer> resultMap = new TreeMap<String, Integer>();
            Scanner cin = new Scanner(System.in);
            int count = cin.nextInt();
            for (int i = 0; i < count; i++) {
                String next = formatInput(cin.next());
                if (!resultMap.containsKey(next)) {
    //                map中没有该元素时
                    resultMap.put(next, 1);
                } else {
    //               map中已经有了该元素
                    resultMap.put(next, resultMap.get(next) + 1);
                }
            }
            boolean repeat = false;
            for (Map.Entry<String, Integer> stringIntegerEntry : resultMap.entrySet()) {
                if (stringIntegerEntry.getValue() > 1) {
                    System.out.println(stringIntegerEntry.getKey() + " " + stringIntegerEntry.getValue());
                    if (!repeat) {
                        repeat = true;
                    }
                }
            }
            if (!repeat) {
                System.out.println("No duplicates.");
            }
        }
    
    
        private static String formatInput(String inputNumber) {
            StringBuilder temp = new StringBuilder();
            for (int i = 0; i < inputNumber.length(); i++) {
                char charAt = inputNumber.charAt(i);
                if (dict.containsKey(charAt)) {
                    temp.append(dict.get(charAt));
                } else if (charAt == '-') {
    //                do nothing
                } else {
                    temp.append(charAt);
                }
            }
            temp.insert(3, "-");
            return temp.toString();
        }
    }
    

    Sample Input

    12
    4873279
    ITS-EASY
    888-4567
    3-10-10-10
    888-GLOP
    TUT-GLOP
    967-11-11
    310-GINO
    F101010
    888-1200
    -4-8-7-3-2-7-9-
    487-3279

    Sample Output

    310-1010 2
    487-3279 4
    888-4567 3

    相关文章

      网友评论

          本文标题:1002_Java

          本文链接:https://www.haomeiwen.com/subject/xwefqctx.html