【题意简述】:中文题,不再赘述!
【思路】:(1)、首先,将各种电话号码表示转换成标准表示:一个长度为 8 的字符串,前三个字符是数字、第 4 个字符是‘-‘、后四个字符是数字。
(2)、根据电话号码的标准表示,搜索重复的电话号码。办法是对全部的电话号码进行排序,这样相同的电话号码就排在相邻的位置。此外,题目也要求在输出重复的电话号码时,要按照号码的字典升序进行输出。
因此:
用一个二维数组 p[100000][9]来存储全部的电话号码,每一行存储一个电话号码的标准表示。每读入一个电话号码,首先将其转换成标准表示,然后存储到二维数组telNumbers 中。全部电话号码都输入完毕后,将数组 p作为一个一维数组,其中每个元素是一个字符串,用C/C++提供的函数模板sort对进行排序。用字符串比较函数strcmp比较 p 中相邻的电话号码,判断是否有重复的电话号码、并计算重复的次数。
// 1024K 375Ms #include<stdio.h> #include<stdlib.h> #include<string.h> char m[]="22233344455566677778889999"; char p[100000][9],buf[1000]; int i,j,k,n,count,duplicate; int compare(const void *elem1,const void *elem2) { return (strcmp( (char*)elem1,(char*) elem2)); }; int main() { scanf("%d\n",&n); for(i=0;i<n;i++) { gets(buf); //忽略连字符 for(k=j=0;buf[j];j++) { if(buf[j]==‘-‘) continue;//忽略连字符 if(buf[j]>=‘A‘&&buf[j]<=‘Z‘) { p[i][k]=m[buf[j]-‘A‘]; } else if(buf[j]>=‘0‘ && buf[j]<=‘9‘) { p[i][k]=buf[j]; } if(++k==3) p[i][k++]=‘-‘;//在第三位插入连字符 } } qsort(p,n,9,compare);//对输入的电话号码进行排序 duplicate=0;//0=没有重复,1=有重复的 count=0; for(i=0;++i<=n;)//搜索重复的电话号码,并进行输出 { count++;//重复次数 if(strcmp(p[i-1],p[i])) { if(count>1)//因为已经排好了序,所以只要遇到不同的就说明重复结束 { printf("%s %d\n",p[i-1],count); duplicate=1;//只要输出了1次就设置成0以外的值 } count=0;//重设出现次数 } } if(duplicate==0) puts("No duplicates."); return 0; }
POJ 1002 487-3279,布布扣,bubuko.com
原文:http://blog.csdn.net/u013749862/article/details/22750971