原题链接:http://poj.org/problem?id=1002
因为之前有一个很善良的同学问我,所以放一个Java版的代码
import java.io.*;
import java.util.*;
import java.security.cert.PolicyNode;
import java.util.Scanner;//输入头文件
import java.util.Arrays;//引入数组类
import java.lang.StringBuffer;
import java.util.HashMap;
import java.util.Map.Entry;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int x=in.nextInt();//读入数据个数
int t=x;
in.nextLine();//读掉输入数字之后的回车
HashMap<String,Integer> hashtable=new HashMap<String,Integer>();//定义一个哈希表
while(t-->=1) {
String s = in.nextLine();//读入字符串
int n = s.length();
String str="";
for (int i=0;i<n;++i) {
if(s.charAt(i)=='-')
continue;
if(s.charAt(i)>='0'&&s.charAt(i)<='9'){
//当原本字符串有0到9时记得也要算在新的字符串里面
str+=(s.charAt(i));
if(str.length()==3)
str+='-';
continue;
}
if(s.charAt(i)=='A'||s.charAt(i)=='B'||s.charAt(i)=='C'){
str+='2';
if(str.length()==3)//这句是保证新的字符串的第4位应该是-
str+='-';
continue;
}
if(s.charAt(i)=='D'||s.charAt(i)=='E'||s.charAt(i)=='F'){
str+='3';
if(str.length()==3)
str+='-';
continue;
}
if(s.charAt(i)=='G'||s.charAt(i)=='H'||s.charAt(i)=='I'){
str += '4';
if(str.length()==3)
str+='-';
continue;
}
if(s.charAt(i)=='J'||s.charAt(i)=='K'||s.charAt(i)=='L'){
str+='5';
if(str.length()==3)
str+='-';
continue;
}
if(s.charAt(i)=='M'||s.charAt(i)=='N'||s.charAt(i)=='O'){
str+='6';
if(str.length()==3)
str+='-';
continue;
}
if(s.charAt(i)=='P'||s.charAt(i)=='R'||s.charAt(i)=='S'){
str+='7';
if(str.length()==3)
str+='-';
continue;
}
if(s.charAt(i)=='T'||s.charAt(i)=='U'||s.charAt(i)=='V'){
str+='8';
if(str.length()==3)
str+='-';
continue;
}
if(s.charAt(i)=='W'||s.charAt(i)=='X'||s.charAt(i)=='Y'){
str+='9';
if(str.length()==3)
str+='-';
continue;
}
}
boolean ok=false;
if(hashtable.containsKey(str)){
//每次得到一个新的字符串可以先判断在哈希表中是否已有同样的字符串,如果有就使其个数加一
int w= hashtable.get(str);//通过键值获得value值
++w;
hashtable.remove(str);//将原来的去除
hashtable.put(str,w);//value值加1之后重新放入
ok=true;
}
if(!ok)//如果这个号码不在哈希表中,就新建一个
hashtable.put(str,1);
}
boolean ok=false;
for(Map.Entry<String,Integer> entry: hashtable.entrySet()) {
if(entry.getValue()>1){
//任何一个号码的数目大于1都表示可以最后可以有输出
ok=true;
break;
}
}
if(!ok){
//如果每个号码都出现一次的话,就输出No duplicates. 再直接返回就好了
System.out.println("No duplicates.");
return;
}
List<Map.Entry<String,Integer>> list=new ArrayList<Map.Entry<String,Integer>>(hashtable.entrySet()); //转换为list进行字典序排序
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String,Integer> o1,Map.Entry<String,Integer> o2) {
return o1.getKey().compareTo(o2.getKey());
}
});
for(int i=0;i<list.size();++i){
if(list.get(i).getValue()>1)//最后只输出个数大于1的号码
System.out.println(list.get(i).getKey()+" "+list.get(i).getValue());
}
/*Iterator it=hashtable.entrySet().iterator();//这个代码可以输出全部情况
while(it.hasNext()){
Map.Entry entry=(Map.Entry) it.next();
if((Integer)entry.getValue()>1)
System.out.println(entry.getKey()+" "+entry.getValue());
}*/
}
}