1002_Java

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 dict = new HashMap() {
        {
            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 resultMap = new TreeMap();
        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 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)