劍指offer面試題49 醜數(Java 實現)

2021-09-12 07:50:16 字數 1072 閱讀 8040

題目:

方法一:逐個判斷每個整數是不是醜數的解法,直觀但不夠高效(暴力法)

思路:所謂乙個數m是另乙個數n的因子,是指n能被m整除,也就是說n%m==0.根據醜數的定義,醜數只能被2,3,5整除。也就是說如果乙個數能被2整除,我們把它連續除以2;如果能被3整除,就連續除以3;如果能被5整除,就除以5。

如果最後我們得到的是1,那麼這個數就是醜數,否則不是,接著我們只需要按照順序判斷每個整數是不是醜數即可。

public class test_forty_night 

} return number;

} public boolean isugly(int number)

}

方法二:以空間換時間,利用乙個陣列來儲存前面已經找到的醜數,再依次得到後面的醜數,這樣就可以直接跳過那些不是醜數的數,不用每乙個數都去判斷。

思路:對乘以2而言,肯定存在某乙個醜數t2,排在它之前的每乙個醜數乘以2得到的結果都會小於已有的最大醜數,在它之後的每乙個醜數乘以2得到的結果都會太大。我們只需記下這個醜數的位置,同時每次生成新的醜數的時候,去更新這個t2.對乘以3和5而言,也存在這同樣的t3和t5。

因為要保證醜數陣列是從小到大排序的,每乙個都要比較一下三個值,取最小值放入陣列中,然後再更新這個最小值。

1、2、3、4、5、8、9、15、16、25…

2、3、5

4、3、5

4、9、5

8、9、5

8、9、25

16、9、25

16、27、25

32、27、25

public int getuglynumber_solution1(int index)

while(uglyarray[multiply3]*3 == uglyarray[i])

while(uglyarray[multiply5]*5 == uglyarray[i])

} return uglyarray[index-1]; }

private int min(int number1, int number2, int number3)

劍指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 醜數

面試題 劍指offer 題目解答 把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。首先我們能想到的方法就是,迴圈遍歷,對每乙個數字進行判斷,如果是醜數那麼數量加一,直到等...