找最大數;及序列生成分析
今日面試題:找到最大數
請構造程式,找到滿足如下條件的最大數:
假設最大數表示為,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釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- matlab 生成隨機數序列Matlab隨機
- 序列中最大的數(51Nod-1062)
- 使用 Linux seq 命令生成數字序列Linux
- jmeter 如何找最優、最大使用者數???JMeter
- 生成序列
- C語言入門題-找二維陣列中最大數及所在行列號 (10分)C語言陣列
- 時間序列分析基本思想及時間序列建模步驟
- 時間序列分析(二)--指數平滑
- 序列生成函式函式
- pta 練習5-2 找兩個數中最大者 (10分)
- leetcode 152 乘積最大子序列LeetCode
- 求最大子序列的問題
- 時間序列分析專題——指數平滑模型模型
- 演算法第四版-找兩個數的最大公約數演算法演算法
- 找質數
- P2642 雙子序列最大和
- [-演算法篇-] 最大子序列和演算法
- 【譯】自動生成整型序列
- 高併發環境下生成序列編碼重複問題分析
- 求最大公約數 & 最大公約數
- 演算法題:乘積最大子序列演算法
- 時間序列分析
- SQL 難點解決:序列生成SQL
- 【時間序列分析】01. 時間序列·平穩序列
- 今日頭條程式設計題1 找"最大"點程式設計
- 數字序列
- DRF-Serializers序列化器元件原始碼分析及改編元件原始碼
- ArrayList 原始碼分析 — 擴容問題及序列化問題原始碼
- ArrayList 原始碼分析 -- 擴容問題及序列化問題原始碼
- 資料結構與演算法分析(c 語言描述)最大子序列和問題資料結構演算法
- 多執行緒下的網格生成及效能分析執行緒
- 二分找數
- 找0的個數
- 遞推--找數字
- 常見效能計數器及分析
- Java自動生成訂單序列號Java
- matlab生成0,1隨機序列Matlab隨機
- Python 時間序列分析Python
- 515. 在每個樹行中找最大值