找最大數;及序列生成分析

紫鳳發表於2013-08-13

今日面試題:找到最大數

請構造程式,找到滿足如下條件的最大數:

假設最大數表示為,abcdefghihk..... 每一個字母表示一位,其中abc,bcd,cde...以此類推,每三個一組,構成的數字是素數,也就是說abc, bcd, cde,等,都是素數,而且這些素數是互不相同的。

=====================================

序列生成分析

原題

給定一個表示式2^i*2^j,其中i,j為非負整數。請找到一種方法,生成如下序列:

2^0 * 5^0 = 1
2^1 * 5^0 = 2
2^2 * 5^0 = 4
2^0 * 5^1 = 5
2^3 * 5^0 = 8
2^1 * 5^1 = 10
2^4 * 5^0 = 16
2^2 * 5^1 = 20
2^0 * 5^2 = 25
...
...
...

請大家開動腦筋,找到更多的方法。

分析

閱讀題目,要得到生成的數字序列是有序的,儘管題目中,並沒有明說。這個題目的方法,是比較多的。我們在這裡介紹幾個。

一個簡單的方法

很多同學,應該接觸過醜數那個題目吧?這個題目相比之下,還要簡單一些。i,j分別是2和5的指數, 則方法的過程如下:

i,j 從0開始,記錄較小的值作為序列的當前生成值。則i=j=0時,最小值為1,就是第一個元素;

兩個值都是最小元素,所以i和j,都自增1,在最小值1的基礎之上乘以2和5得到2,5, 取較小的2作為序列的值,即2,第二個;

此時,只對i進行變化,自增1,在其上一個值的基礎之上乘以2,即,2*2=4,再與5比較最小值

依次類推

這個方法的關鍵是i和j何時遞增,以及用陣列儲存i和j計算的結果。 程式碼如下:

enter image description here

其他方法

上面方法的變種,還是比較多的。關鍵就是圍繞著怎麼每次產生最小的值。有的同學採用最小堆,有的同學採用棧。都是可以得到最終的結果的,但都沒有上面的方法精煉。

還有的同學提到用動態規劃的方法,這也是一種很好的思路。對於dp[n],判斷其是否能夠表示為2^i*5^j的形式,可以表示為如下的遞迴形式

dp[n] = ((n % 2 == 0) && (dp[n/2])) || ((n % 5 == 0) && (dp[n/5]))

並且,顯而易見,存在重複利用的遞迴子過程。但是這個方法,對於n比較大的時候,空間會比較大。因為中間有太多的n不滿足條件,我們仍然做了儲存,進行了計算。

【分析完畢】

本文來自微信:待字閨中,2013-08-10釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章