題目:
方法一:逐個判斷每個整數是不是醜數的解法,直觀但不夠高效(暴力法)
思路:所謂乙個數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個醜數。首先我們能想到的方法就是,迴圈遍歷,對每乙個數字進行判斷,如果是醜數那麼數量加一,直到等...