1002题描述了为了便于记忆,经常将电话号码(数字)转换成英文字母,由于英文字母和数字是多对一的关系,因此不同的表示可能代表的是同一个电话号码,此题给一定个 数的电话号码,要求将任何号码转换成统一的格式,统计同样的号码出现的次数,如果转换后有相同的号码,按照XXX- XXXX的格式输出7位数字,后面跟上出现次数,如果没有重读的,则输出No duplicates.
我想说此题真是坑啊,巨坑!花了我两天时间才找到为啥错了,思想方法倒不难,先读入数据转换成数字字符串存入,然后排序,最后统计输出。但是数据量太大,开始开的数组 大小为1000019的,一提交就是WA、WA。我急了,测试的数据全都过了,几经周折,找到了原题的测试数据,当输入12个、甚至1000个程序都没有问题,统计 结果仍然相同,但是都数据量到达10万的时候,就会出现错误,测试了几组10W个的数据,错误都在我统计结果的最后几十条。终于,想到了是不是我数组开小了,换成10 10009后,果然自己机器上跑的结果终于正确了。
但是!我拿这个程序提交时,竟然又是WA,真是觉得见鬼了,后来换成C编译器才好了。真是奇怪,我自己就是用的GCC编译器,提交就是WA,最后再将数组开到1100 00*9后终于GCC也过了,对此我觉得是不是我用的的GCC的版本问题,是不是编译器优化过了,相比poj上的编译器效率更高呢?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int strComp(const void *a, const void *b){
return strcmp((char*)a, (char *)b);
}
void main(){
int number,i=0,j,m,count=0,l,flag=0;
char s[100];
char c[101000][9];
int p[101000];
memset(c,'\0',sizeof(c));
scanf("%d",&number);
while( count < number && number<=100000){
memset(s,'\0',sizeof(s));
scanf("%s",s);
getchar();
l=strlen(s);
for(j=0,m=0;m<l;m++){
if(j==3){
c[i][j]='-';
j++;
}
if(s[m] == '-')
continue;
if(s[m]>=65 && s[m]<90){
switch(s[m]){
case 'A': case 'B': case 'C':
c[i][j]='2';break;
case 'D': case 'E': case 'F':
c[i][j]='3';break;
case 'G': case 'H': case 'I':
c[i][j]='4';break;
case 'J': case 'K': case 'L':
c[i][j]='5';break;
case 'M': case 'N': case 'O':
c[i][j]='6';break;
case 'P': case 'R': case 'S':
c[i][j]='7';break;
case 'T': case 'U': case 'V':
c[i][j]='8';break;
case 'W': case 'X': case 'Y':
c[i][j]='9';break;
default:
break;
}
}
else{
c[i][j]=s[m];
}
j++;
}
i++;
count++;
}
qsort(c[0],number,9,strComp);
memset(p,0,number);
for(i=0;i<number-1;i++){
m=i;
p[i]++;
while(strcmp(c[i],c[i+1])==0){
p[m]++;
flag=1;
i++;
}
if(flag==1){
printf("%s %d\n",c[i-1],p[m]);
flag=2;
}
}
if(flag==0)
printf("No duplicates.\n");
}
微信扫一扫,订阅我的博客动态^_^