面試題34:醜數

標籤: 劍指offerjava


題目描述
只包含因子2,3,5的數稱爲醜數,1是第一個醜數,求第n個醜數是什麼。算法

思路:
1 . 暴力法
  從1開始遍歷每一個整數,判斷每一個數是否是醜數,是的話計數器加1,當計數器等於n時,返回當前遍歷到的整數。這種算法要計算1到第n個醜數中間的全部數。數組

// 判斷一個數是否爲醜數
public boolean isUgly(int number){
    while(number % 2 == 0) number /= 2;
    while(number % 3 == 0) number /= 3;
    while(number % 5 == 0) number /= 5;
    return (number == 1) ? true : false;
}

// 計算第n個醜數
public int getNthUglyNumber(int n){
    if(n <= 0) return 0;
    int number = 0;
    int count = 0;
    
    while(count < n){
        number++;
        if(isUgly(number)) count++;
    }
    
    return number;
}

2 . 空間換時間法
  使用數組存儲1開始的全部醜數,每次根據已有醜數計算下一個醜數,並加到數組中,直到n個醜數所有算出來。
  這種算法只須要計算每個醜數,忽略掉不是醜數的數,比第一種思路好,可是須要n的空間。
  醜數生成規則,由已有醜數x2,x3,x5中選取一個最小值做爲下一個醜數。這裏t2,t3,t5是能生成最新醜數的已有醜數下標,須要不斷更新。code

public int getNthUglyNumber(int n){
    if(n <= 0) return 0;
    int [] uglys = new int[n];
    uglys[0] = 1;
    int pCurr = 0;
    int t2 = 0; t3 = 0; t5 = 0;
    while(pCurr < n){
        int curr = min(uglys[t2] * 2, uglys[t3] * 3, uglys[t5] * 5);
        uglys[pCurr] = curr;
        while(uglys[t2] * 2 <= curr) t2++;
        while(uglys[t3] * 3 <= curr) t3++;
        while(uglys[t5] * 5 <= curr) t5++;
        pCurr++;
    }
    int result = uglys[n - 1];
    return result;
}
相關文章
相關標籤/搜索