1. 程式人生 > >LeetCode演算法題-Power of Four(Java實現-六種解法)

LeetCode演算法題-Power of Four(Java實現-六種解法)

這是悅樂書的第205次更新,第216篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第72題(順位題號是342)。給定一個整數(帶符號的32位),寫一個函式來檢查它是否為4的冪。例如:

輸入:16
輸出:true

輸入:5
輸出:false

跟進:你可以在沒有迴圈/遞迴的情況下解決它嗎?

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

02 第一種解法

特殊情況:當num小於等於1時,直接返回num和1是否相等的結果。

正常情況:先判斷對4取餘是否等於0,如果等於0,則num除以4繼續迴圈,最後判斷num是否等於1。

public boolean isPowerOfFour(int num) {
    if (num <= 1) {
        return num == 1;
    }
    while (num%4 == 0) {
        num /= 4;
    }
    return num == 1;
}


03 第二種解法

使用遞迴的方式,判斷邏輯和第一種解法一致。

public boolean isPowerOfFour2(int num) {
    if (num <= 1) {
        return num == 1;
    }
    if (num > 1 ) {
        return num%4 == 0 && isPowerOfFour2(num/4);
    }
    return false;
}


04 第三種解法

利用Integer.toString(int par1, int par2)方法,將num轉成4進位制字串,然後匹配以1開頭且尾隨k(k>=0)個0的正則。

public boolean isPowerOfFour3(int num) {
    return num > 0 && Integer.toString(num, 4).matches("10*");
}


05 第四種解法

將4的所有冪次方整數放入一個HashSet中,然後判斷num是否被包含在其中。

public boolean isPowerOfFour4(int num) {
    Set<Integer> set = new HashSet<>(Arrays.asList(1, 4, 16, 64, 256, 1024, 4096, 16384, 65536,
            262144, 1048576, 4194304, 16777216, 67108864, 268435456, 1073741824));
    return num > 0 && set.contains(num);
}


06 第五種解法

使用數學運算中的對數。

4^X == N
log (4^X) == log N
X log 4 == log N
X == (log N) / (log 4)

如果num是4的冪次方,那麼將兩數取對數後再做除法,得到的是一個以冪次方為整數位,以0位小數位的double型別數,那麼對其取整再和自身做減法,那麼它的絕對值肯定是無限接近於0的。

public boolean isPowerOfFour5(int num) {
    double d = Math.log(num)/Math.log(4);
    return Math.abs(d - Math.round(d)) <= 0.00000000001;
}


07 第六種解法

如果num是4的冪次方,那麼其二進位制數會滿足兩個條件:

  • 只會有一個1。

  • 後面尾隨0的個數是偶數個。

第一個條件藉助包裝類Integer的bitCount方法,第二個條件依舊藉助這個方法,但是物件變成了num-1,統計完1的位數後,對2取餘,判斷1的個數是否為偶數。

public boolean isPowerOfFour6(int num) {
    return num > 0 && Integer.bitCount(num) == 1 && Integer.bitCount(num-1)%2 == 0;
}


08 小結

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

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