一开始我没看清题目要求的输出是字符串按升序排列,而是按重复次数生序排列。以致很长时间没通过。请原谅哥。
以下是算法的分析:
第一:我们用一维数组来存贮匹配的数字,可题目要求把q,z去掉,而且怎么将字符与数字进行匹配呢?
字符本身是24个,那么我们就存24个,把没有的置零就行了。这不是一种方法吗。(如果有很好的方法请联系,虚心受教)
比如 hash[]="2223334445556667077888990" 就行了。
第二:匹配并替换成数字后,我们就在操作之前升序排序,反正题目要求,而且排序后可以发现数组的连续内存中号码有一致的情况,除非是 NO duplicates。
然后就是输出了,注意格式就行了,这题大抵这样.
但是我打了几次还是没有通过,基本上市 timed limit。
解决:
如果用冒泡或者简单快排,就通不过,(我试过)。看了别人的代码。他们用了快速排序。
快排:
参 数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
char hash[] = "22233344455566670778889990";
char telphone[100001][20];
char temp[20];
int compare( const void *arg1, const void *arg2 )
{
return strcmp((char*)arg1, (char*)arg2 );
}
int main()
{
int flag = 0;
int nCases,j,k,i;
int t;
scanf("%d", &nCases);
for(i = 0; i < nCases; ++i)
{
scanf("%s", telphone[i]);
t=0;
for(j = 0; j <strlen(telphone[i]); ++j)
{
if(telphone[i][j] >= 'A' && telphone[i][j] <= 'Z')
temp[t++] = hash[telphone[i][j]-'A'];
else if(telphone[i][j] >= '0' && telphone[i][j] <= '9')
temp[t++] = telphone[i][j];
else if(telphone[i][j] == '-')
;
}
strcpy(telphone[i], temp);
}
qsort(telphone, nCases, sizeof(telphone[0]), compare);//必须有排序函数。
for(i = 0; i < nCases; ++i)
{
int cnt = 1;
strcpy(temp, telphone[i]);
for(j = i+1; j < nCases; ++j)
{
if(strcmp(temp, telphone[j]) == 0)
cnt++;
else
break;
}
if(cnt > 1)
{
flag = 1;
for(k = 0; k < 3; ++k)
printf("%c", temp[k]);
printf("-");
for(k = 3; k < 7; ++k)
printf("%c", temp[k]);
printf(" %d\n", cnt);
}
i = j-1;
}
if(flag == 0)
printf("No duplicates.\n");
return 0;
}