找最大數;及序列生成分析
今日面試題:找到最大數
請構造程式,找到滿足如下條件的最大數:
假設最大數表示為,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計算的結果。 程式碼如下:
其他方法
上面方法的變種,還是比較多的。關鍵就是圍繞著怎麼每次產生最小的值。有的同學採用最小堆,有的同學採用棧。都是可以得到最終的結果的,但都沒有上面的方法精煉。
還有的同學提到用動態規劃的方法,這也是一種很好的思路。對於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釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 序列生成;及合併總數分析
- ACM 尋找最大數ACM
- 缺失的數字;及找數字分析
- 找數字續;及缺失的數字分析
- 找數字;及最長等差數列分析
- 括號匹配;及找數字續分析
- 最長等差數列;及子序列分析
- 合併總數;及相差最大分析
- 周長最長;及找到最大數分析
- 相伴一生;及構造最大數分析
- 構造最大數;及熟悉的陌生人分析
- matlab 生成隨機數序列Matlab隨機
- 相差最大;及逆序分析
- iOS生成最大最小數之間隨機數iOS隨機
- 子序列;及又見排序分析排序
- 使用 Linux seq 命令生成數字序列Linux
- Google賽馬;及最大矩形分析Go
- C語言入門題-找二維陣列中最大數及所在行列號 (10分)C語言陣列
- 尋找最大公因數(歐幾里得演算法)--C語言描述演算法C語言
- 找陣列的波谷;及巧妙排序的分析陣列排序
- 序列生成函式函式
- 時間序列分析基本思想及時間序列建模步驟
- 分詞問題;及最大乘積分析分詞
- 繩子的長度;及找陣列的波谷分析陣列
- 使用 Java 8 函數語言程式設計生成字母序列Java函數程式設計
- 演算法第四版-找兩個數的最大公約數演算法演算法
- 數字之魅:尋找陣列中的最大值和最小值陣列
- 最大乘積;及最新版本分析
- [-演算法篇-] 最大子序列和演算法
- 【譯】自動生成整型序列
- HDU 2662 Coin && HDU 1792 A New Change Problem (互質數最大不能生成數)
- 尋找Java程式碼生成器Java
- 高併發環境下生成序列編碼重複問題分析
- 演算法題:乘積最大子序列演算法
- oracle序列達到了最大值處理Oracle
- P2642 雙子序列最大和
- SQL 難點解決:序列生成SQL
- MyEclipse序列號生成程式碼Eclipse