劍指offer 面試題49 醜數

2021-09-11 06:29:38 字數 958 閱讀 7898

面試題–【劍指offer】 題目解答

把只包含質因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。

首先我們能想到的方法就是,迴圈遍歷,對每乙個數字進行判斷,如果是醜數那麼數量加一,直到等於n的時候,返回。但是如此計算有乙個很大的問題就是,每乙個數字都需要計算一次,即使這個數不是醜數,所以計算消耗非常大,是不會通過要求的。

有沒有只需要計算醜數的方法?

答案是肯定的,我們可以發現乙個規律,如果p是醜數,那麼根據題目可以知道

p =2

x∗3y

∗5

zp=2^x * 3^y * 5^z

p=2x∗3

y∗5z

換句話說我們只要賦予x,y,z不同的值就可以得到不同的醜數,那麼如果要根據順序找出醜數我們需要怎麼辦呢? 根據醜數具有的性質,我們已知1是第乙個醜數,那麼可以把1分別乘上2,3,5然後在乘積中選出最小的作為第2個醜數。然後我們再對剛新加的醜數(2)分別乘上2,3,5 然後在乘積中(包括前一步1乘,3,5的結果)選出最小的作為第3個醜數,依次類推。

這裡邊有乙個細節需要注意,設有醜數pp<2q,那麼「我」在前面比你小的數都沒被選上,你後面生成新的醜數一定比「我」大吧,那麼你乘2生成的醜數一定比我乘2的大吧,那麼在我選上之後你才有機會選上。

其實每次我們只用比較3個數:用於乘2的最小的數、用於乘3的最小的數,用於乘5的最小的數。也就是比較(2x , 3y, 5z) ,x>=y>=z的

簡而言之,我們就是根據已知算出乙個結果,然後把結果作為已知去算下乙個結果,逐次計算即可。題目有點燒腦,但是**寫起來還是很好理解!可以畫圖輔助理解!

class solution 

return result[index -1]

;}};

劍指offer 面試題49 醜數

我們把只包含因子2 3 和 5 的數稱作醜數 ugly number 求按照從小到大的順序的第1500個醜數。例如,6 8都是醜數,但是14不是,因為它包含因子7。習慣上我們把1當做第乙個醜數。有空再補上 public class 49 uglynumber return uglynumbers i...

《劍指offer》面試題49 醜數

設計乙個演算法,找出只含素因子2,3,5 的第 n 小的數。符合條件的數如 1,2,3,4,5,6,8,9,10,12 思路 思路1 從1開始遞增,依次判斷每個數是否是醜數,不夠高效 思路2 思路1之所以效率低,比較關鍵的一點是遍歷的每乙個數字都進行醜數判斷。思路2不是去判斷醜數,而是計算出醜數 因...

劍指offer 面試題49 醜數

題目描述 把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。通俗易懂的解釋 首先從醜數的定義我們知道,乙個醜數的因子只有2,3,5,那麼醜數p 2 x 3 y 5 z,xy...