Description
给你一个字符串,将其转化成一个电话号码XXX-XXXX的形式,除Q,Z外每个大写字母都有其对应的数字:
A,B,C-2
D,E,F-3
G,H,I-4
J,K,L-5
M,N,O-6
P,R,S-7
T,U,V-8
W,X,Y-9
找出多组号码中是否有相同的号码
Input
数据组数n(n<=100000),每组一个字符串
Output
如果有重复的号码,以XXX-XXXX输出并输出其出现次数,如果没有重复号码则输出No duplicates.
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
Solution
计算每个号码的hash值,排序,比较有无相同的即可
Code
#include<cstdio>
#include<algorithm>
using namespace std;
char s[31];
int Hash()//将字符串转化为hash值
{
int sum=0;
for(int i=0,k=0;k<7;i++)
{
if(s[i]>='0'&&s[i]<='9')//若是数字则直接计算
{
sum*=10;
k++;
sum+=(s[i]-'0');
}
else if(s[i]>='A'&&s[i]<'Z')//若是字母则转化为数字后计算
{
sum*=10;
k++;
sum+=((s[i]-'A'-(s[i]>'Q'))/3+2);//跳过Q
}
}
return sum;
}
int main()
{
int n;
scanf("%d",&n);
int data[100005];
getchar();
for(int tmp=0;tmp<n;tmp++)
{
gets(s);
data[tmp]=Hash();
}
sort(data,data+n);
bool p=false;//标志变量,判断是否有重复的号码
n--;
for(int i=0,num=1;i<n;i+=num=1)
{
while(data[i]==data[i+1])
{
num++;
i++;
}
if(num>1)
{
printf("%03d-%04d %d\n",data[i]/10000,data[i]%10000,num);
p=true;
}
}
if(!p)printf("No duplicates.\n");
return 0;
}