電話號碼問題

2021-07-11 14:37:34 字數 3583 閱讀 7147

問題描述

商業單位需要容易記憶的**號碼,有一些方法可以讓**號碼變得更容易記憶。譬如,可以把**號碼寫成單詞或短語,如 mon-glop 可以代表滑鐵盧大學的**。有時僅僅是把號碼的一部分寫成單詞,如打 310-gino 便可向 gino 比薩餅店定購比薩。另一種讓**號碼容易記憶的方法是將數字用一種容易記的方式組合起來,譬如 3-10-10-10 也可以代表 gino 比薩餅店。

**號碼的標準形式是七位十進位制數字,在它的第三位和第四位之間用連字元連線(例如:666-1200)。**的鍵盤提供了字元與數字之間的對映關係,如下所示:

2a、b和c 

3d、e和f 

4g、h和i 

5j、k和l 

6m、n和o 

7p、r和s 

8t、u和v 

9w、x和y 

q 和 z 沒有對映到鍵盤,而連字元不需要被撥打並且可以根據需要新增和刪除。mon-glop 的標準形式是 666-4567,310-gino 的標準形式是310-4466,3-10-10-10的標準形式也是 310-1010。

如果兩個**號碼有相同的標準形式,那麼這兩個**號碼是相同的。

你所在的公司正在編輯一本當地商業單位的**簿,作為質量控制流程的一部分,你需要確認在該**簿中有沒有錯誤的**號碼,以及有沒有兩個(或兩個以上的)商業單位使用相同的**號碼。由於當地只使用了 3 和 6 兩個區段,因此**號碼的第乙個數字應當永遠是 3 或者 6,如果出現了其它數字,就表示這個**號碼錯了。此外,如果**號碼中出現了 q 和 z,也說明這個**錯了。

一次輸入為乙個樣例。每個號碼一行,每行的字元不會超過 20 個。每次輸入的資料可能會非常大,譬如超過 1,000,000 個**號碼。

你可以假設輸入中可能會出現重複的**號碼不超過 1,500 個,每個號碼重複的次數不超過 1000 次。

輸出包括兩個部分,第乙個部分是錯誤的**號碼,對於這些號碼應當按照輸入的順序以原始的形式輸出。在輸出錯誤**號碼前輸出「error:」,隨後輸出這些號碼,如果沒有錯誤的**號碼,則輸出「not found.」。

第二部分是重複的**號碼,對每乙個在**簿中以任何形式出現一次以上的**號碼,生成一行輸出。這一行應以標準形式給出**號碼,其後跟隨乙個空格,空格後跟隨**號碼在**簿中出現的次數。所有重複的**號碼輸出行應以號碼的公升序排列(小號碼在前)。在輸出重複**號碼前輸出「duplication」,隨後按照上述格式輸出號碼,如果在輸入中沒有重複的**號碼,則輸出:「not found.」。

你所編寫的程式以後可能會在一種特殊的嵌入式裝置上執行,為了降低成本,這種裝置使用的 cpu 不是很快、可用的 ram 為 288k(跟 gba 一樣)且它沒有磁碟裝置因此不能使用檔案作為資料的臨時儲存。

請參考《程式設計珠璣》第一部分,若程式不能在規定的記憶體中執行,則不得分。

測試輸入

期待的輸出

時間限制

記憶體限制

額外程序

測試用例 1

以文字方式顯示

4873279↵

its-easy↵

666-4567↵

3-10-10-10↵

666-glop↵

mon-glop↵

367-11-11↵

310-gino↵

f101010↵

666-1200↵

-4-8-7-3-2-7-9↵

487-3279↵

以文字方式顯示

error:↵

4873279↵

its-easy↵

-4-8-7-3-2-7-9↵

487-3279↵

↵duplication:↵

310-1010 2↵

666-4567 3↵

1秒512kb

0測試用例 2

以文字方式顯示

3456789↵

以文字方式顯示

error:↵

not found.↵

↵duplication:↵

not found.↵

1秒512kb0

題解思路

首先寫幾個等式和幾個小常識1t=1024g,1g=1024m,1m=1024k,1k=1024b,乙個位元組=8b;int用2個位元組儲存,範圍是-32768~32767,long用4個位元組儲存,範圍是-2147483648~2147483647,unsigned int用2個位元組儲存,範圍是0~65535,unsigned long用4個位元組儲存,範圍是0~4294967295,float用4個位元組儲存,範圍是10^-38~10^38,double用8個位元組儲存,範圍是10^-308~10^308,long double用16個位元組儲存,範圍是10^-4913~10^4913.知道了這些以後如果題目再卡記憶體的話,我們就可以自己計算自己的程式大約需要使用多大的記憶體了。

整體思路:

因為**號碼最多會有1000000個,無論是用整形陣列還是字元型陣列來儲存根據上面的資訊計算都是會超過512k的,所以需要另找方法來儲存,使用盡可能少的空間來表示盡可能多的量。參考了《程式設計珠璣》的一部分內容,之後知道了點陣圖儲存的方式,說白了我們一般儲存的時候是以位元組為單位來儲存的,但是點陣圖是以位來儲存的,因為乙個位元組有8個位所以這樣存空間一下子就節省了8倍。但是這個存存的只是某乙個**號碼是否存在的一種狀態,僅僅儲存了一種狀態。

中間儲存的過程就是用乙個unsigned char型的陣列或是unsigned int型的陣列來儲存,如果用char來儲存,先將**號碼判斷之後轉化為乙個百萬大小的數字,然後由於首位不是3就是6,所以取後面的6位進行儲存即可。假設這個數是i,那麼就可以用c[i/8]=c[i/8]|1<

注意:(1)注意「-」不影響**號碼的正確性,無論在什麼地方都不影響。

(2)因為卡記憶體,所以大家開陣列的時候肯定都會比較小心的擦這邊界開,不會開的很隨意,所以這個時候要注意自己的程式是否會出現越界的情況。

時間問題,如果不知道自己的程式那個地方做了多餘的計算或是判斷,可以進行這樣的除錯,就是單步執行,然後看程式跑的時候跟自己心中想的效果是不是一樣的。如果程式多走了,那麼就需要對多走的部分進行修改,一般情況下就是設定標記變數,對於陣列和結構體來說使用多少就迴圈多少。

實現**

#include#include#includestruct node

shu[1501];

int cmp(const void *a,const void *b)

/*int mi(int x)

else

else if(a[0]=='3'||a[0]=='6'||a[0]=='d'||a[0]=='e'||a[0]=='f'||a[0]=='m'||a[0]=='n'||a[0]=='o'||a[0]=='-')

else if(a[i]>='0'&&a[i]<='9')

else if(a[i]>='a'&&a[i]

else;}

else

} //轉化為整形的數

if(29999990)

else if(shu[i].geshu>0)

else;}

if(flag2==0)

return 0;

}

電話號碼問題

商業單位需要容易記憶的 號碼,有一些方法可以讓 號碼變得更容易記憶。譬如,可以把 號碼寫成單詞或短語,如 mon glop 可以代表滑鐵盧大學的 有時僅僅是把號碼的一部分寫成單詞,如打 310 gino 便可向 gino 比薩餅店定購比薩。另一種讓 號碼容易記憶的方法是將數字用一種容易記的方式組合起...

小學期 電話號碼問題

商業單位需要容易記憶的 號碼,有一些方法可以讓 號碼變得更容易記憶。譬如,可以把 號碼寫成單詞或短語,如 mon glop 可以代表滑鐵盧大學的 有時僅僅是把號碼的一部分寫成單詞,如打 310 gino 便可向 gino 比薩餅店定購比薩。另一種讓 號碼容易記憶的方法是將數字用一種容易記的方式組合起...

遮蔽電話號碼

private static final string regex fixedphone 010 02 d 0 3 9 d d private static final pattern pattern zipcode pattern.compile regex fixedphone 遮蔽 號碼,固定...