題意:輸入N個(0<=N<=10000)電話號碼,輸入只包括0-9,A-Z(除Q、Z)和連字號,其中A-Z的26字母除Q與Z分別對應相應一位元字。按字典序輸出出現次數大於2的電話號碼標準形式(即全部由數字組成並且3、4位有一個連字號)與出現次數。如果沒有次數大於2的電話號碼輸出“No duplicate!”。注意這裡電話號碼標準形式7位元字。
分析:簡單字串處理與排序。資料規模比較大,一般的排序很可能逾時。這裡採用空間換時間的計數排序,字母數字轉換採用雜湊表。
C++源碼
#include <stdio.h></p><p>const int N = 10000000;<br />unsigned int times[N];<br />int main()<br />{<br /> int num;<br /> // talbe[]="ABCDEFGHIGKLMNOPQRSTUVWXYZ"<br /> char table[]="22233344455566670778889990", s[128];</p><p> scanf("%d", &num);<br /> for(int i=0;i<num;i++){<br /> scanf("%s", s);<br /> int sum = 0;<br /> for(int j=0;s[j]!='/0';j++){<br /> if(s[j]>='A' && s[j]<='Z')<br /> sum = sum*10 + table[(int)(s[j]-'A')]-'0';<br /> else if(s[j]>='0' && s[j]<='9')<br /> sum = sum*10 + s[j]-'0';<br /> }<br /> times[sum]++;<br /> }<br /> int f=0;<br /> for(int i=0;i<N;i++){<br /> if(times[i]>=2){<br /> f=1;<br /> printf("%03d-%04d %d/n", i/10000,i%10000,times[i]);<br /> }<br /> }<br /> if(f==0) printf("No duplicates./n");<br /> return 0;<br />}<br />