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+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!