【题意简述】:中文题,不再赘述!
【思路】:(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