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;
}