實現第N個醜數的輸出

醜數(Ugly Number):我們把只包含質因子2、3、5的數稱爲醜數。例如4、6、10都是醜數,但是14不是醜數,因爲其包含因子7。

習慣上把1稱爲第一個醜數。

題目:按照從小到大的順序輸出第N個醜數。

題目分析:

  • 假設我們已經得到n個醜數,接下來要產生第n+1個醜數;則第n+1個醜數爲前面某個醜數A * 2,B * 3,C * 5中的最小值。
  • 第一個醜數爲1,則第二個醜數爲1*2,1*3,1*5中的最小值,即爲2;第三個醜數則爲2*2,1*3,1*5中的最小值,即爲3;以此類推,求出第N個醜數。
  • 設置3個變量記錄下標,開始循環,每次將前面醜數的2,3,5的倍數中最小的作爲當前循環的數,更新下標,依次類推,最後輸出數組的N-1索引的值即爲第N個醜數。

JS代碼實現:

function uglyNumber(n){
	if(n === 0) return 0;
	var uglyNum = [1];
	var param2 = 0, param3 = 0, param5 = 0;
    for(var i = 1; i < n; i++){
    	uglyNum[i] = Math.min(uglyNum[param2]*2, uglyNum[param3]*3, uglyNum[param5]*5);
    	if(uglyNum[i] === uglyNum[param2]*2) param2++;
    	if(uglyNum[i] === uglyNum[param3]*3) param3++;
    	if(uglyNum[i] === uglyNum[param5]*5) param5++;
    }
    return uglyNum[n - 1];
}

Java代碼實現:

public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if(index <= 0) return 0;
        int[] result = new int[index];
        result[0] = 1;
        int k2=0, k3=0, k5=0;
        for(int i = 1; i < index; i++){
            result[i] = Math.min(result[k2] *2, Math.min(result[k3] *3, result[k5] *5));
            if(result[i] == result[k2] *2) 
                k2++;
            if(result[i] == result[k3] *3) 
                k3++;
            if(result[i] == result[k5] *5) 
                k5++;
        }
        return result[index-1];
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章