一開始我沒看清題目要求的輸出是字符串按升序排列,而是按重複次數生序排列。以致很長時間沒通過。請原諒哥。
以下是算法的分析:
第一:我們用一維數組來存貯匹配的數字,可題目要求把q,z去掉,而且怎麼將字符與數字進行匹配呢?
字符本身是24個,那麼我們就存24個,把沒有的置零就行了。這不是一種方法嗎。(如果有很好的方法請聯繫,虛心受教)
比如 hash[]="2223334445556667077888990" 就行了。
第二:匹配並替換成數字後,我們就在操作之前升序排序,反正題目要求,而且排序後可以發現數組的連續內存中號碼有一致的情況,除非是 NO duplicates。
然後就是輸出了,注意格式就行了,這題大抵這樣.
但是我打了幾次還是沒有通過,基本上市 timed limit。
解決:
如果用冒泡或者簡單快排,就通不過,(我試過)。看了別人的代碼。他們用了快速排序。
快排:
參 數:1 待排序數組首地址 2 數組中待排序元素數量 3 各元素的佔用空間大小 4 指向函數的指針,用於確定排序的順序
如int cmp(const void *a, const void *b)中有兩個元素作爲參數,返回一個int值,如果比較函數返回大於0,qsort就認爲a > b,返回小於0qsort就認爲a <b。qsort知道元素的大小了,就可以把大的放前面去。如果你的比較函數返回本來應該是1的(即a > b),而卻返回-1(小於0的數),那麼qsort認爲a < b,就把b放在前面去,但實際上是a > b的,所以就造成了降序排序的差別了。
#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;
}