1. 程式人生 > >LeetCode演算法題-Ugly Number(Java實現-四種解法)

LeetCode演算法題-Ugly Number(Java實現-四種解法)

這是悅樂書的第199次更新,第208篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第64題(順位題號是263)。編寫一個程式來檢查給定的數字是否是一個醜陋的數字。醜陋的數字是正數,其主要因子僅包括2,3,5。例如:

輸入:6
輸出:true
說明:6 = 2×3

輸入:8
輸出:true
說明:8 = 2×2×2

輸入:14
輸出:false
說明:14並不醜陋,因為它包含另一個因子7。

注意

  • 1通常被視為醜陋的數字。

  • 輸入在32位有符號整數範圍內:[ -2^31, 2^31 - 1]。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

特殊情況:1是醜陋數字,小於等於0的不是醜陋數字。

正常情況:num如果是醜陋數字,可以分為兩種情況:一是單純的某一因子的冪次方,二是三個因子的隨機排列組合,可能兩個一起出現,也有可能三個一起出現。除以這三個因子中的一個,最後商是1,則說明這個數是醜陋數字;除以這三個因子中的兩個或三個,最後商是1,那麼這個數也是醜陋數字。

對此,使用兩層迴圈,外層迴圈控制因子,從2開始,一直到5,中間有個4其實就是2的平方,也可以算作其中的一個因子,內層迴圈先判斷對當前因子取餘是否等於0,如果不等於0則說明可能是另外的因子的積,也有可能不是醜陋數字,如果等於0,則除以當前因子獲取商,重新賦值給num,繼續判斷和迴圈。

public boolean isUgly(int num) {
    if (num > 0) {
        for (int i = 2; i < 6; i++) {
            while (num % i == 0) {
                num /= i;
            }
        }
    }
    return num == 1;
}


03 第二種解法

將2,3,5這三個因子放入陣列,使用兩層迴圈,外層依次取出陣列中的因子,內層做取餘判斷和求商,前提條件是num大於0。

public boolean isUgly2(int num) {
    if (num > 0) {
        int[] arr = {2, 3, 5};
        for (int d : arr) {
            while (num % d == 0) {
                num /= d;
            }
        }
    }
    return num == 1;
}


04 第三種解法

也可以分開來計算商,使用3個迴圈分開判斷取餘和求商,最後判斷num等不等於1。

public boolean isUgly3(int num) {
    if (num > 0) {
        while (num % 2 == 0) {
            num /= 2;
        }
        while (num % 3 == 0) {
            num /= 3;
        }
        while (num % 5 == 0) {
            num /= 5;
        }
    }
    return num == 1;
}


05 第四種解法

使用遞迴的解法,判斷邏輯和上面兩種解法一樣,對2取餘等於0的話,除以2後繼續呼叫自身,對於3和5,情況一樣,最後判斷是否等於1。

public boolean isUgly4(int num) {
    if (num <= 0) {
        return false;
    }
    if (num % 2 == 0) {
        return isUgly4(num/=2);
    }
    if (num % 3 == 0) {
        return isUgly4(num/=3);
    }
    if (num % 5 == 0) {
        return isUgly4(num/=5);
    }
    return num == 1;
}


06 小結

演算法專題目前已連續日更超過一個月,演算法題文章64+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!