企業喜歡用容易被記住的電話號碼。讓電話號碼容易被記住的一個辦法是將它寫成一個容易記住的單詞或者短語。例如,你需要給 Waterloo 大學打電話時,可以撥打 TUT-GLOP。有時,只將電話號碼中部分數字拼寫成單詞。當你晚上回到酒店,可以通過撥打 310-GINO來向 Gino's 訂一份 pizza。讓電話號碼容易被記住的另一個辦法是以一種好記的方式對號碼的數字進行分組。通過撥打 Pizza Hut 的“三個十”號碼 3-10-10-10,你可以從他們那里訂pizza。
電話號碼的標準格式是七位十進制數,并在第三、第四位數字之間有一個連接符。電話撥號盤提供了從字母到數字的映射,映射關系如下:
A, B, 和 C 映射到 2D, E, 和 F 映射到 3G, H, 和 I 映射到 4J, K, 和 L 映射到 5M, N, 和 O 映射到 6P, R, 和 S 映射到 7T, U, 和 V 映射到 8W, X, 和 Y 映射到 9Q 和 Z 沒有映射到任何數字,連字符不需要撥號,可以任意添加和刪除。 TUT-GLOP 的標準格式是 888-4567, 310-GINO 的標準格式是 310-4466, 3-10-10-10 的標準格式是 310-1010。如果兩個號碼有相同的標準格式,那么他們就是等同的(相同的撥號)
你的公司正在為本地的公司編寫一個電話號碼薄。作為質量控制的一部分,你想要檢查是否有兩個和多個公司擁有相同的電話號碼。輸入數據
輸入:輸入的格式是,第一行是一個正整數,指定電話號碼薄中號碼的數量(最多 100000)。余下的每行是一個電話號碼。每個電話號碼由數字,大寫字母(除了 Q 和 Z)以及連接符組成
輸出要求
輸出:對于每個出現重復的號碼產生一行輸出,輸出是號碼的標準格式緊跟一個空格然后是它的重復次數。如果存在多個重復的號碼按照號碼的字典升序輸出。如果沒有重復的號碼,輸出一行:
No duplicates.輸入樣例
124873279ITS-EASY888-45673-10-10-10888-GLOPTUT-GLOP967-11-11310-GINOF101010888-1200-4-8-7-3-2-7-9-487-3279輸出樣例
310-1010 2487-3279 4888-4567 3問題分析
為了便于記憶,將電話號碼翻譯成單詞、短語,并進行分組。同一個電話號碼,有多種表示方式。為判斷輸入的電話號碼中是否有重復號碼,要解決兩個問題。 (1)將各種電話號碼表示轉換成標準表示:一個長度為 8 的字符串,前三個字符是數字、第 4 個字符是'-'、后四個字符是數字。 (2)根據電話號碼的標準表示,搜索重復的電話號碼。辦法是對全部的電話號碼進行排序,這樣相同的電話號碼就排在相鄰的位置。此外,題目也要求在輸出重復的電話號碼時,要按照號碼的字典升序進行輸出。
解決方案
用一個二維數組 telNumbers[100000][9]來存儲全部的電話號碼,每一行存儲一個電話號碼的標準表示。每讀入一個電話號碼,首先將其轉換成標準表示,然后存儲到二維數組telNumbers 中。全部電話號碼都輸入完畢后,將數組 telNumbers 作為一個一維數組,其中每個元素是一個字符串,用 C/C++提供的函數模板 sort 對進行排序。用字符串比較函數 strcmp比較 telNumbers 中相鄰的電話號碼,判斷是否有重復的電話號碼、并計算重復的次數。
參考程序
#include <iostream>#include <cstdio> #include <cstring>#include <cstdlib>using namespace std;char map[]="22233344455566677778889999";char str[80],telNumbers[100000][9];//排序 int compare(const void *_elem1,const void *_elem2){ char* elem1 = (char*)_elem1; char* elem2 = (char*)_elem2; return strcmp(elem1,elem2);}void standardizeTel(int n){ int j,k; j=k=-1; while(k<8){ j++; if(str[j]=='-') continue; k++; //第四個字符是'-' if(k==3){ telNumbers[n][k]='-'; k++; } //字符是字母的情況 if(str[j]>='A'&&str[j]<='Z'){ telNumbers[n][k]=map[str[j]-'A']; continue; } //字符是數字的情況 telNumbers[n][k]=str[j]; } telNumbers[n][k]='/0'; return;} int main(){ int n,i,j; bool noduplicate; cin>>n; for(i=0;i<n;i++){ cin>>str; standardizeTel(i);//進行標準格式化 } qsort(telNumbers,n,9,compare);//字符串排序 noduplicate = true; i = 0; while(i<n){ j=i; i++; //判斷相臨位是否相同 while(i<n&&strcmp(telNumbers[i],telNumbers[j])==0){ i++; } if(i-j > 1){ PRintf("%s %d/n",telNumbers[j],i-j); noduplicate=false; } } if(noduplicate){ cout<<"No duplicates."<<endl; } return 0;}
新聞熱點
疑難解答