成长轨迹50 【ACM算法之路 百炼poj.grids.cn】【字符串处理】【2974:487-3279】
题目http://poj.grids.cn/practice/2974
【ac代码】
1 //先处理字符串,然后为了找重复个数简单些,注意先排序
2 //再找出最前和最后一个相同的号码,下标相减即可
3 //看书后,使用系统函数qsort()——要补充函数compare()
4 //后面部分小心处理数组越界问题。。。
5 #include <stdio.h>
6 #include <string.h>
7 #include <stdlib.h>
8
9 char num[100020][10];
10 int map[26]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,0,7,7,8,8,8,9,9,9};//【Q没有对应!】
11
12 int compare(const void * item1,const void * item2)
13 {
14 return (strcmp((char*)item1,(char*)item2));
15 }
16
17 int main()
18 {
19 int n;
20 scanf("%d",&n);
21 for(int i=0;i<n;i++)
22 {
23 char temp[80];//【以防万一,改大些。。】
24 scanf("%s",temp);
25 //int len=strlen(temp);
26 int k=0;
27 for(int j=0;k<8;j++)//【注意只有7位数字+1位符号】
28 {
29 if(temp[j]=='-')
30 continue;
31 if(k==3)
32 {
33 num[i][k++]='-';//【这里不能continue!】
34 }
35 if(temp[j]>='A'&&temp[j]<='Z')
36 num[i][k++]=char(map[temp[j]-'A']+'0');
37 else
38 num[i][k++]=temp[j];
39 }
40 num[i][k]='\0';//【这里要有结束符】
41
42 }
43 qsort(num,n,10,compare);
44
45
46 bool Noduplicates = true;
47 for(int j=0,k=0;j<n;)
48 {
49 k=j;
50 j++;
51 while(j<n && strcmp(num[k],num[j])==0)//【注意是判断j<n而非k<n】
52 {
53 j++;
54 }
55 if(j-k>1)//【是j-k不是k-j。。。】
56 {
57 printf("%s %d\n",num[k],j-k);
58 Noduplicates = false;
59 }
60 }
61 if(Noduplicates)
62 printf("No duplicates.\n");
63 return 0;
64 }