[問題描述] git
Businesses like to have memorable telephone numbers. One way to make a telephone number memorable is to have it spell a memorable word or phrase. For example, you can call the University of Waterloo by dialing the memorable TUT-GLOP. Sometimes only part of the number is used to spell a word. When you get back to your hotel tonight you can order a pizza from Gino's by dialing 310-GINO. Another way to make a telephone number memorable is to group the digits in a memorable way. You could order your pizza from Pizza Hut by calling their ``three tens'' number 3-10-10-10. 數組
[問題描述譯文] 函數
企業喜歡用容易被記住的電話號碼。讓電話號碼容易被記住的一個辦法是將它寫成一個容易記住的單詞或者短語。例如,你須要給 Waterloo 大學打電話時,能夠撥打 TUT-GLOP。有時,只將電話號碼中部分數字拼寫成單詞。當你晚上回到酒店,能夠經過撥打 310-GINO來向 Gino's 訂一份 pizza。讓電話號碼容易被記住的另外一個辦法是以一種好記的方式對號碼的數字進行分組。經過撥打 Pizza Hut 的「三個十」號碼 3-10-10-10,你能夠從他們那裏訂pizza。電話號碼的標準格式是七位十進制數,並在第3、第四位數字之間有一個鏈接符。電話撥號盤提供了從字母到數字的映射,映射關係以下:測試
A, B, 和 C 映射到 2spa
D, E, 和 F 映射到 3翻譯
G, H, 和 I 映射到 4設計
J, K, 和 L 映射到 53d
M, N, 和 O 映射到 6blog
P, R, 和 S 映射到 7排序
T, U, 和 V 映射到 8
W, X, 和 Y 映射到 9
Q 和 Z 沒有映射到任何數字,連字符不須要撥號,能夠任意添加和刪除。 TUT-GLOP 的標準格式是 888-4567,310-GINO 的標準格式是 310-4466,3-10-10-10 的標準格式是 310-1010。若是兩個號碼有相同的標準格式,那麼他們就是等同的(相同的撥號)你的公司正在爲本地的公司編寫一個電話號碼薄。做爲質量控制的一部分,你想要檢查是否有兩個和多個公司擁有相同的電話號碼。
[需求分析]
輸入
輸入第一行是一個正整數,指定電話號碼薄中號碼的數量(最多 100000)。餘下的每行是一個電話號碼。每一個電話號碼由數字,大寫字母(除了 Q 和 Z)以及鏈接符組成.
輸出
對於每一個出現重複的號碼產生一行輸出,輸出是號碼的標準格式緊跟一個空格而後是它的重複次數。若是存在多個重複的號碼按照號碼的字典升序輸出。若是沒有重的號碼,輸出一行:No duplicates.
樣例輸入
12
4873279
ITS-EASY
888-4567
3-10-10-10
888-GLOP
TUT-GLOP
967-11-11
310-GINO
F101010
888-1200
-4-8-7-3-2-7-9-
487-3279
樣例輸出
310-1010 2
487-3279 4
888-4567 3
[概要設計]
爲了便於記憶,將電話號碼翻譯成單詞、短語,並進行分組。同一個電話號碼,有多種表示方式。爲判斷輸入的電話號碼中是否有重複號碼,要解決兩個問題。(1)將各類電話號碼錶示轉換成標準表示:一個長度爲 8 的字符串,前三個字符是數字、第 4 個字符是'-'、後四個字符是數字。(2)根據電話號碼的標準表示,搜索重複的電話號碼。辦法是對所有的電話104號碼進行排序,這樣相同的電話號碼就排在相鄰的位置。此外,題目也要求在輸出重複的電話號碼時,要按照號碼的字典升序進行輸出。2. 解決方案(1)個人想法:創建一個char [9],字符轉數字,符號、數字保留,再提取存入一個數組case[100000],不如建一個二維數組Telephone_Number[10000][9],全都轉化數字後,相等的按條件輸出。(2)答案思路,解決方案:用一個二維數組 telNumbers[100000][9]來存儲所有的電話號碼,每一行存儲一個電話號碼的標準表示。每讀入一個電話號碼,首先將其轉換成標準表示,而後存儲到二維數組telNumbers 中。所有電話號碼都輸入完畢後,將數組 telNumbers 做爲一個一維數組,其中每一個元素是一個字符串,用C/C++提供的函數模板sort對進行排序。用字符串比較函數strcmp比較 telNumbers 中相鄰的電話號碼,判斷是否有重複的電話號碼、並計算重複的次數,(3)比較分析:a. 與其經歷一番操做再按順序輸出,不如先排序再輸出。(利用 sort 函數排序,strcpy比較)b. 在二維數組中排序操做複雜,那就再把二維數組轉存進一維數組,對一維數組操做
[完整程序]
#include <map>
#include <cstdio>
#include <cstring>
using namespace std;
map<char, int> key;
int pre(char *s)
{
int re = 0;
int p = 0;
while (s[p] != '\0')
{
if (s[p] != '-')
{
if (s[p] >= '0' && s[p] <= '9')
re = re * 10 + s[p] - '0';
else
re = re * 10 + key[s[p]];
}
++p;
}
return re;
}
int main()
{
int n;
char s[1000];
key['A'] = key['B'] = key['C'] = 2;
key['D'] = key['E'] = key['F'] = 3;
key['G'] = key['H'] = key['I'] = 4;
key['J'] = key['K'] = key['L'] = 5;
key['M'] = key['N'] = key['O'] = 6;
key['P'] = key['R'] = key['S'] = 7;
key['T'] = key['U'] = key['V'] = 8;
key['W'] = key['X'] = key['Y'] = 9;
while (EOF != scanf("%d", &n))
{
map<int, int> mp;
for (int i = 0; i < n; ++i)
{
scanf("%s", s);
++mp[pre(s)];
}
map<int, int>::iterator it;
bool flag = 0;
for (it = mp.begin(); it != mp.end(); ++it)
{
if (it->second >= 2)
{
printf("%03d-%04d %d\n", it->first/10000, it->first%10000, it->second);
flag = 1;
}
}
if (!flag)
printf("No duplicates.\n");
}
return 0;
}
[使用說明]
運行環境VC6.0,使用語言:C++。
[測試結果]