poj百練 1002

一開始我沒看清題目要求的輸出是字符串按升序排列,而是按重複次數生序排列。以致很長時間沒通過。請原諒哥大笑

原題大意:英文字母(除Q和Z外)和電話號碼存在着對應關係,如下所示:
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
標準的電話號碼格式是xxx-xxxx,其中x表示0-9中的一個數字。有時爲了方便記憶電話號碼,我們會將電話號碼的數字轉變爲英文字母,如把263-7422記成America。有時,我們還加上“-”作爲分隔符,如把449-6753記成Hi-World。當然,我們未必要將所有的數字都轉變爲字母,比如474-6635可以記成iPhone-5。
總之,一個方便記憶的電話號碼由數字和除Q、Z外的英文字母組成,並且可以在任意位置插入任意多的“-”符號。
現在 ,我們有一個列表,記錄着許多方便記憶的電話號碼。不同的方便記憶的電話號碼可能對應相同的標準號碼,你的任務就是找出它們。

 

以下是算法的分析:

    第一:我們用一維數組來存貯匹配的數字,可題目要求把q,z去掉,而且怎麼將字符與數字進行匹配呢?

    字符本身是24個,那麼我們就存24個,把沒有的置零就行了。這不是一種方法嗎。(如果有很好的方法請聯繫,虛心受教)

    比如  hash[]="2223334445556667077888990" 就行了。

    第二:匹配並替換成數字後,我們就在操作之前升序排序,反正題目要求,而且排序後可以發現數組的連續內存中號碼有一致的情況,除非是 NO duplicates。

    然後就是輸出了,注意格式就行了,這題大抵這樣.

   但是我打了幾次還是沒有通過,基本上市 timed limit。

 解決:

   如果用冒泡或者簡單快排,就通不過,(我試過)。看了別人的代碼。他們用了快速排序。

快排:

原 型: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
功 能: 使用快速排序例程進行排序

參 數:1 待排序數組首地址 2 數組中待排序元素數量 3 各元素的佔用空間大小 4 指向函數的指針,用於確定排序的順序
說明:qsort函數是ANSI C標準中提供的,其聲明在stdlib.h文件中,是根據二分法寫的,其時間複雜度爲n*log(n)。
qsort要求提供的函數是需要自己定義的一個比較函數,比較函數使得qsort通用性更好。有了比較函數qsort可以實現對數組、字符串、結構體等結構進行升序或降序排序。
如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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章