大致题意是首先一个整形变量n表示输入字符串的数量,然后紧跟n行字符串表示的号码,其中字符ABCD……分别映射相应的数字,特别值得注意的是,只有这个号码出现的次数大于1才会在结果中输出,否则输出 No duplicates.
解决这个题用字符传的相应操作的话,可能会超时,浏览好多大牛写的文章,学了一种我感觉比较巧妙的方法处理这个问题。分别将字符串转化成一个7位的整型数字,在判重和计算相同字符串的出现次数时,也想当简单,输出是要注意输出格式,这个很重要!!好了不多说了,直接上代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
char str[50];
int times[10000000];
bool vis[10000000];
int out[100000];
int main()
{
int i, j, n, pos = 0;
int flag = 0;
cin >> n;
memset(vis, false, sizeof(vis));
memset(times, 0, sizeof(times));
for(i = 0; i < n; i++)
{
cin >> str;
int sum = 0;
for(j = 0; str[j] != '\0'; j++)
{
if(str[j] == '-' || str[j] == 'Q' || str[j] == 'Z')
continue;
else if(str[j] >= '0' && str[j] <= '9')
sum = sum * 10 + str[j] - '0';
else
{
if(str[j] == 'A' || str[j] == 'B' || str[j] == 'C')
str[j] = '2';
else if(str[j] == 'D' || str[j] == 'E' || str[j] == 'F')
str[j] = '3';
else if(str[j] == 'G' || str[j] == 'H' || str[j] == 'I')
str[j] = '4';
else if(str[j] == 'J' || str[j] == 'K' || str[j] == 'L')
str[j] = '5';
else if(str[j] == 'M' || str[j] == 'N' || str[j] == 'O')
str[j] = '6';
else if(str[j] == 'P' || str[j] == 'R' || str[j] == 'S')
str[j] = '7';
else if(str[j] == 'T' || str[j] == 'U' || str[j] == 'V')
str[j] = '8';
else if(str[j] == 'W' || str[j] == 'X' || str[j] == 'Y')
str[j] = '9';
sum = sum * 10 + str[j] - '0';
}
}
times[sum]++;
if(!vis[sum] && times[sum] >= 2)
{
flag = 1;
vis[sum] = true;
out[pos] = sum;
pos++;
}
}
if(!flag)
cout << "No duplicates." << endl;
else
{
sort(out, out + pos);
for(i = 0; i < pos; i++)
{
printf("%03d-%04d %d\n", out[i] / 10000, out[i] % 10000, times[out[i]]);
}
}
return 0;
}