//方法一:直接调用TreeMap,9040K/3516MS //Main.java import java.io.*; import java.util.Set; import java.util.TreeMap; public class Main{ //键值用Integer会比用String效率高一点 private static int[] LETTER2NUMBER={ 2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,-1,7,7,8,8,8,9,9,9,-1}; //LETTER2NUMBER['D'-'A']=3 private static int[] scale={1000000,100000,10000,1000,100,10,1}; public static void main(String[] args)throws IOException{ BufferedReader cin=new BufferedReader(new InputStreamReader(System.in)); int count=Integer.parseInt(cin.readLine()); TreeMap<Integer,Integer> map=new TreeMap<Integer,Integer>(); for(int i=0;i<=count-1;i++){ int pos=0; String tmp=cin.readLine(); Integer result=0; for(int j=0;j<=tmp.length()-1;j++){ if(tmp.charAt(j)=='-')continue; if(tmp.charAt(j)>='A'){ //思考为什么不用加&&tmp[j]<='Z' result+=LETTER2NUMBER[tmp.charAt(j)-'A']*scale[pos]; pos++; } else{ result+=(tmp.charAt(j)-'0')*scale[pos]; pos++; } } if(map.containsKey(result)){ map.put(result, map.get(result)+1); } else map.put(result,1); } Set<Integer> keys=map.keySet(); int mark=0; for(Integer key:keys){ int times=map.get(key); if(times!=1){ mark=1; System.out.printf("%03d-%04d %d\n",key/10000,key%10000,times); } } if(mark==0)System.out.println("No duplicates."); cin.close(); } }
//方法二:调用Arrays.sort(number),5948K/3313MS //Main.java import java.io.*; import java.util.Arrays; public class Main{ private static int[] LETTER2NUMBER={ 2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,-1,7,7,8,8,8,9,9,9,-1}; //LETTER2NUMBER['D'-'A']=3 private static int[] scale={1000000,100000,10000,1000,100,10,1}; private static void PrintCount(int[] x){ int mark=0,count=1; for(int i=1;i<=x.length-1;i++){ //准备输出的两种情况:遇到不同值,遇到数组尾 if(x[i]!=x[i-1]||i==x.length-1){ if(x[i]==x[i-1])count++; if(count<=1)continue; //注意这里是i-1而非i System.out.printf("%03d-%04d %d\n",x[i-1]/10000,x[i-1]%10000,count); mark=1;count=1; } else count++; } if(mark==0)System.out.println("No duplicates."); } public static void main(String[] args)throws IOException{ BufferedReader cin=new BufferedReader(new InputStreamReader(System.in)); int count=Integer.parseInt(cin.readLine()); int[] number=new int[count]; for(int i=0;i<=count-1;i++){ int pos=0; String tmp=cin.readLine(); for(int j=0;j<=tmp.length()-1;j++){ if(tmp.charAt(j)=='-')continue; if(tmp.charAt(j)>='A'){ //思考为什么不用加&&tmp[j]<='Z' number[i]+=LETTER2NUMBER[tmp.charAt(j)-'A']*scale[pos]; pos++; } else{ number[i]+=(tmp.charAt(j)-'0')*scale[pos]; pos++; } } } Arrays.sort(number); PrintCount(number); cin.close(); } }
//方法三:手写QSort并优化,5944K/3297MS //聚集相等元素可以提升QSort性能 //普通QSort:4523/5/87589 //改进QSort:423/555/8789 //Main.java import java.io.*; class Sort{ public static void QSort(int[] x,int left,int right){ if(left>=right)return; int l=left,r=right; int tag=x[left]; int sl=left,sr=right; //用于标记左右两端已获得的相等元素 while(l!=r){ while(r>l&&x[r]>=tag){ if(x[r]==tag){ x[r]=x[sr]; x[sr]=tag; sr--; }//将相等元素移至末端 r--; } x[l]=x[r]; while(l<r&&x[l]<=tag){ if(x[l]==tag){ x[l]=x[sl]; x[sl]=tag; sl++; }//将相等元素移至末端 l++; } x[r]=x[l]; } x[l]=tag; //将两端的相等元素交换至枢轴附近 for(int i=left;i<=sl-1;i++){ x[i]=x[l-1-(i-left)]; x[l-1-(i-left)]=tag; } for(int i=right;i>=sr+1;i--){ x[i]=x[l+1+(right-i)]; x[l+1+(right-i)]=tag; } QSort(x,left,l-1-(sl-left)); QSort(x,l+1+(right-sr),right); } public static void PrintCount(int[] x){ int mark=0,count=1; for(int i=1;i<=x.length-1;i++){ //准备输出的两种情况:遇到不同值,遇到数组尾 if(x[i]!=x[i-1]||i==x.length-1){ if(x[i]==x[i-1])count++; if(count<=1)continue; //注意这里是i-1而非i System.out.printf("%03d-%04d %d\n",x[i-1]/10000,x[i-1]%10000,count); mark=1;count=1; } else count++; } if(mark==0)System.out.println("No duplicates."); } } public class Main{ private static int[] LETTER2NUMBER={ 2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,-1,7,7,8,8,8,9,9,9,-1}; //LETTER2NUMBER['D'-'A']=3 private static int[] scale={1000000,100000,10000,1000,100,10,1}; public static void main(String[] args)throws IOException{ BufferedReader cin=new BufferedReader(new InputStreamReader(System.in)); int count=Integer.parseInt(cin.readLine()); int[] number=new int[count]; for(int i=0;i<=count-1;i++){ int pos=0; String tmp=cin.readLine(); for(int j=0;j<=tmp.length()-1;j++){ if(tmp.charAt(j)=='-')continue; if(tmp.charAt(j)>='A'){ //思考为什么不用加&&tmp[j]<='Z' number[i]+=LETTER2NUMBER[tmp.charAt(j)-'A']*scale[pos]; pos++; } else{ number[i]+=(tmp.charAt(j)-'0')*scale[pos]; pos++; } } } Sort.QSort(number, 0, number.length-1); Sort.PrintCount(number); cin.close(); } }