劍指Offer 醜數

2021-08-15 16:35:27 字數 1914 閱讀 6281

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

解法一:逐一判斷是否是醜數,簡單但是不夠高效       數字n是數字m的因子說明m%n==0。醜數的因子只有2、3和5,說明乙個數number如果能被2整除我們就將它連續除2;如果能被3整除我們就連續除以3;如果能被5整除我們就連續除以5。如果最後number==1,說明這個數是醜數,否則不是。

實現**:

//判斷乙個數是否為醜數

private

static

boolean

isuglynum

(long num)

while

(num%3==

0)while

(num%5==

0)if(num==1)

return

false;}

private

static

long

getuglynum

(int counts)

int index =0;

long num =0;

while

(index}return num;

}

為了獲取第1500個醜數我們所要驗證的數字數量遠遠大於1500,有太多的非醜數驗證,這樣的效率太低下了。

解法二:建立陣列存放醜數,通過已有醜數產生新的醜數       我們不要把精力花費在驗證是否是醜數上,我們應該考慮如何生成醜數。有第乙個醜數1,那麼將這個醜數分別*2、*3、*5得到醜數2、3、5,再分別*2、*3、*5得到(4、6、10)

*2、(6、9、15)

*3、(10、15、25)

*5,我們需要考慮去重,但是最困難的是要將這個陣列中的醜數進行有小到大的排序,譬如找第10個醜數12,可是就這個方法來說去重後第10個醜數是25,還要進行下一輪的乘法才能得到12。我們要改進。

這個方法的關鍵之處在於我們要按照從小到大的順序生成醜數。只有這樣我們才能獲得指定的第幾個醜數。假設陣列中已經有若干個醜數排好序後存放在陣列中 ,並且把己有最大的醜數記做m,我們接下來分析如何生成下乙個醜數 。該醜數肯定是前面某乙個醜數乘以2、3 或者 5 的結果,所以我們首先考慮把已有的每個醜數乘以2。在乘以2 的時候,能得到若干個小於或等於 m 的結果。由於是按照順序生成的, 小於或者等於 m 肯定己經在陣列中了,我們不需再次考慮:還會得到若干 個大於 m 的結果,但我們只需要第乙個大於 m 的結果,因為我們希望醜數是按從小到大 的順序生成的,其他更大的結果以後再說。我們把得到的第乙個乘以2 後大於 m 的結果記為 m2。 同樣,我們把已有的每乙個醜數乘以3 和 5,能得到第乙個大於 m 的結果 m3 和 m5 那麼下乙個醜數應該是 m2、m3 和 m5 這 3 個數的最小者。

我們還需要紀錄乘以2、乘以3和乘以5得來的最大醜數的下標。拿乘以2得到的醜數最大值為例。對於最大醜數之前的醜數滿足這樣的規則:之前的醜數*2都小於等於最大醜數。乙個迴圈就可確定乘以2得來的最大醜數的位置。乘以3和乘以5得來的最大醜數字置類似。

實現**:

private

static

long

getuglynum

(int index)

long ugly = uglynums[nextuglyindex-1]

;return ugly;

}private

static

long

min(

long number1,

long number2 ,

long number3)

劍指offer 醜數

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 參考程式設計師面試金典 偽 如下 1 初始化array和佇列 q2 q3 q5 2 將1插入array 3 分別將1 2...

劍指offer 醜數

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 為了保證時間達到要求,可以將所求得的醜數都儲存在陣列中,然後再取出。前面的醜數乘以2 3或5中的最小的乙個是下乙個醜數。...

劍指offer 醜數

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。思路 如果p是醜數,那麼p 2 x 3 y 5 z 那麼只要賦予x,y,z不同的值就能得到不同的醜數。如果要順序找出醜數,要知...