487-3279
解题思路:
开一个10e7的数组a,将每个电话号码转换成整数,对应下标的数组+1。算是暴力了
- 最后for循环输出的时候,一定要从0开始,例如有个电话号码是000-0110,这样从1000000开始就不对了。
- a数组一定要是全局变量,不然就会超时,不知道是不是因为减少了实参和形参之间的传递。有大神可以解释一下吗
解题代码:
#include<iostream>
using namespace std;
int a[10000000]={0};
int deal(char c){
if(c=='-'||c=='Q'||c=='Z') return -1;
else if(c>='0'&&c<='9') {return c-'0';}
else if(c>='A'&&c<='C') {return 2;}
else if(c>='D'&&c<='F') {return 3;}
else if(c>='G'&&c<='I') {return 4;}
else if(c>='J'&&c<='L') {return 5;}
else if(c>='M'&&c<='O') {return 6;}
else if(c>='P'&&c<='S') {return 7;}
else if(c>='T'&&c<='V') {return 8;}
else if(c>='W'&&c<='Y') {return 9;}
}
int main(){
int n;
char s[111],c;
scanf("%d%c",&n,&c);//c是为了消除换行符
for(int i=0;i<n;i++){
scanf("%s",s);//不用吸收换行符是因为将换行符变成下一个循环结束标志
int tel=0;
for(int j=0;s[j];j++){
int k=deal(s[j]);
if(k==-1) continue;
tel=tel*10+k;
}
a[tel]++;
}
int flag=0;
for(int i=0;i<10000000;i++){//必须从0开始,如果有一个电话号码是000-0000,那就不能从1000000开始
if(a[i]>1){
flag=1;
printf("%03d-%04d %d\n",i/10000,i%10000,a[i]);
}
}
if(!flag)cout<<"No duplicates."<<endl;;
return 0;
}