C语言字符串处理(含有字符映射,数组排序,比较,与计数)

 

电话号码的标准格式是七位十进制数,并在第三、第四位数字之间有一个连接符。电话拨 号盘提供了从字母到数字的映射,映射关系如下: 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 Q 和 Z 没有映射到任何数字,连字符不需要拨号,可以任意添加和删除。 TUT-GLOP 的标 准格式是 888-4567,310-GINO 的标准格式是 310-4466,3-10-10-10 的标准格式是 310-1010。 如果两个号码有相同的标准格式,那么他们就是等同的(相同的拨号) 你的公司正在为本地的公司编写一个电话号码薄。作为质量控制的一部分,你想要检查是 否有两个和多个公司拥有相同的电话号码。 输入:输入的格式是,第一行是一个正整数,指定电话号码薄中号码的数量(最多 100000)。 余下的每行是一个电话号码。每个电话号码由数字,大写字母(除了 Q 和 Z)以及连接符 组成 输出:对于每个出现重复的号码产生一行输出,输出是号码的标准格式紧跟一个空格然后 是它的重复次数。如果存在多个重复的号码按照号码的字典升序输出。如果没有重复的号码, 输出一行: No duplicates. 输入样例 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 输出样例 310-1010 2 487-3279 4 888-4567 3

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char str[80],telnumb[100000][9];
char map[]="22233344455566677778889999";
int compare(const void*a,const void*b){
return(strcmp((char*)a,(char*)b));
}
void standardize(int m){
int l=-1,s=-1;
while(s<8){
l++;
if(str[l]=='-')
continue;
s++;
if(s==3){
telnumb[m][s]='-';
}
if('A'<=str[l]&&str[l]>='Z'){
telnumb[m][s]=map[str[l]-'A'];
continue;
}
telnumb[m][s]=str[l];
}
telnumb[m][9]='\0';
}
int main(){
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%s",str);
standardize(i);
}
qsort(telnumb,n,9,compare);
i=0;
bool noduplicate=true;
while(i<n){
j=i;
i++;
while(i<n&&strcmp(telnumb[i],telnumb[j])==0)i++;
if(i-j>1){
printf("%s %d\n",telnumb[j],i-j);
noduplicate=false;
}
}
if(noduplicate){
printf("noduplicate\n");
}
return 0;
}

 

posted @ 2017-11-12 19:43  jrx  阅读(1729)  评论(0编辑  收藏  举报