【題意簡述】:中文題,不再贅述!
【思路】:(1)、首先,將各種電話號碼表示轉換成標准表示:一個長度為 8 的字符串,前三個字符是數字、第 4 個字符是'-'、後四個字符是數字。
(2)、根據電話號碼的標准表示,搜索重復的電話號碼。辦法是對全部的電話號碼進行排序,這樣相同的電話號碼就排在相鄰的位置。此外,題目也要求在輸出重復的電話號碼時,要按照號碼的字典升序進行輸出。
因此:
用一個二維數組 p[100000][9]來存儲全部的電話號碼,每一行存儲一個電話號碼的標准表示。每讀入一個電話號碼,首先將其轉換成標准表示,然後存儲到二維數組telNumbers 中。全部電話號碼都輸入完畢後,將數組 p作為一個一維數組,其中每個元素是一個字符串,用C/C++提供的函數模板sort對進行排序。用字符串比較函數strcmp比較 p 中相鄰的電話號碼,判斷是否有重復的電話號碼、並計算重復的次數。
// 1024K 375Ms #include#include #include char m[]="22233344455566677778889999"; char p[100000][9],buf[1000]; int i,j,k,n,count,duplicate; int compare(const void *elem1,const void *elem2) { return (strcmp( (char*)elem1,(char*) elem2)); }; int main() { scanf("%d\n",&n); for(i=0;i ='A'&&buf[j]<='Z') { p[i][k]=m[buf[j]-'A']; } else if(buf[j]>='0' && buf[j]<='9') { p[i][k]=buf[j]; } if(++k==3) p[i][k++]='-';//在第三位插入連字符 } } qsort(p,n,9,compare);//對輸入的電話號碼進行排序 duplicate=0;//0=沒有重復,1=有重復的 count=0; for(i=0;++i<=n;)//搜索重復的電話號碼,並進行輸出 { count++;//重復次數 if(strcmp(p[i-1],p[i])) { if(count>1)//因為已經排好了序,所以只要遇到不同的就說明重復結束 { printf("%s %d\n",p[i-1],count); duplicate=1;//只要輸出了1次就設置成0以外的值 } count=0;//重設出現次數 } } if(duplicate==0) puts("No duplicates."); return 0; }