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