1. 程式人生 > >LintCode.517.醜數

LintCode.517.醜數

Lintcode醜數原題

題目描述:

寫一個程式來檢測一個整數是不是醜數

醜數的定義是,只包含質因子 2, 3, 5 的正整數。比如 6, 8 就是醜數,但是 14 不是醜數以為他包含了質因子 7。

注意事項

可以認為 1 是一個特殊的醜數。

您在真實的面試中是否遇到過這個題? Yes 哪家公司問你的這個題? Airbnb Alibaba Amazon Apple Baidu Bloomberg Cisco Dropbox Ebay Facebook Google Hulu Intel
Linkedin Microsoft NetEase Nvidia Oracle Pinterest Snapchat Tencent Twitter Uber Xiaomi Yahoo Yelp Zenefits
感謝您的反饋
樣例

給出 num = 8,返回 true。 給出 num = 14,返回 false

解題思路:

由於num的因數只有2、3、5三個數字,因此只要將num連續除以2再連續除以3再連續除以5,如果最後的結果為1,那麼可知該數符合條件。

程式碼如下:

	/*醜數
	*只包含質因子 2, 3, 5 的正整數
	*/
	public static boolean isUgly(int num) {
		boolean b = false;
		if (num == 1) {
			b = true;
		} else if(num > 1) {
			while (num % 2 == 0) {  // 連續除以2,直到num因數裡不再含有2 
				num = num / 2;
			}
			if (num != 1) {
				while (num % 3 == 0) {  //連續除以3
					num = num / 3;
				}
				if (num != 1) {
					while (num % 5 == 0) {  // 連續除以5
						num = num / 5;
						if(num == 1){
							b = true;
							break;
						}
					}
				} else {
					b = true;
				}
			} else {
				b = true;
			}
		}
		return b;
	}


補充:醜數問題2

求按從小到大的順序的第N個醜數。
求解思路:我們已知前四個醜數是1,2,3,5.由於後面的醜數的因子都只有2、3、5(不算自身和1),那麼只要將2、3、5這三個醜數不斷乘以2、3、5,取最小值作為下一個醜數即可。
程式碼如下:
    public int GetUglyNumber_Solution(int index) {
        int re = 0;
        if (index == 0) {
            return 0;
        } else {
            ArrayList<Integer> res = new ArrayList<Integer>();
            res.add(1);
            int i2 = 0, i3 = 0, i5 = 0;
            while (res.size() < index) {
                int num2 = res.get(i2) * 2;
                int num3 = res.get(i3) * 3;
                int num5 = res.get(i5) * 5;
                int min = Math.min(num3, Math.min(num2, num5));
                res.add(min);
                if (min == num2) {
                    i2++;
                }
                if (min == num3) {
                    i3++;
                }
                if (min == num5) {
                    i5++;
                }
            }
            return res.get(res.size() - 1);
        }
    }