1. 程式人生 > >Leetcode 263. Ugly Number--是正數,並且質因子是2,3,5

Leetcode 263. Ugly Number--是正數,並且質因子是2,3,5

Write a program to check whether a given number is an ugly number.

Ugly numbers are positive numbers whose prime factors only include 2, 3, 5.

Example 1:

Input: 6
Output: true
Explanation: 6 = 2 × 3

Example 2:

Input: 8
Output: true
Explanation: 8 = 2 × 2 × 2

Example 3:

Input: 14
Output: false 
Explanation: 14 is not ugly since it includes another prime factor 7.

Note:

  1. 1 is typically treated as an ugly number.
  2. Input is within the 32-bit signed integer range: [−231,  231 − 1].

要特別注意Note 2的提示,可能會輸入負數,但是隻有正數才可能是醜數,不然很容易造成超時!

public class Leetcode_263_UglyNumber {

    public static void main(String[] args) {
        Leetcode_263_UglyNumber leetcode_263_uglyNumber = new Leetcode_263_UglyNumber();
        System.out.println(leetcode_263_uglyNumber.isUgly(45 * 45 * 45));
    }

    /**
     * 2ms
     *
     * @param num
     * @return
     */
    public boolean isUgly(int num) {
        //Ugly number is positive!,沒有這句的話導致 Time Limit Exceeded
        if (num <= 0) {
            return false;
        }

        while (num % 2 == 0) {
            num = num / 2;
        }

        while (num % 3 == 0) {
            num = num / 3;
        }

        while (num % 5 == 0) {
            num = num / 5;
        }

//        if (num == 1) {
//            return true;
//        } else {
//            return false;
//        }

//        return num == 1 ? true : false;

        return num == 1;
    }

    /**
     * 優化後 2ms
     *
     * @param num
     * @return
     */
    public boolean isUgly2(int num) {
        if (num <= 0) {
            return false;
        }
        for (int i = 2; i < 6; i++) {
            while (num % i == 0) {
                num /= i;
            }
        }
        return num == 1;
    }

    /**
     * 第二次優化後  30 ms
     *
     * @param num
     * @return
     */
    public boolean isUgly3(int num) {
        for (int i = 2; i < 6 && num > 0; i++) {
            while (num % i == 0) {
                num /= i;
            }
        }
        return num == 1;
    }
}

Runtime: 2 ms, faster than 43.61% of Java online submissions for Ugly Number.