額,又是一道裝逼解法的算法題

題目來源於 LeetCode 上第 342 號問題:4 的冪。題目難度爲 Easy,目前經過率爲 45.3% 。java

題目描述

給定一個整數 (32 位有符號整數),請編寫一個函數來判斷它是不是 4 的冪次方。算法

示例 1:編程

輸入: 16
輸出: true

示例 2:segmentfault

輸入: 5
輸出: false

進階:
你能不使用循環或者遞歸來完成本題嗎?函數

題目解析

這道題最直接的方法就是不停的去除以 4 ,看最終結果是否爲 1 ,參見代碼以下:spa

class Solution {
    public boolean isPowerOfFour(int num) {
         while ( (num != 0)  && (num % 4 == 0)) {
            num /= 4;
        }
        return num == 1;
    }
}

不過這段代碼使用了 循環 ,逼格不夠高。code

對於一個整數而言,若是這個數是 4 的冪次方,那它一定也是 2 的冪次方。blog

咱們先將 2 的冪次方列出來找一下其中哪些數是 4 的冪次方。遞歸

十進制 二進制
2 10
4 100 (1 在第 3 位)
8 1000
16 10000(1 在第 5 位)
32 100000
64 1000000(1 在第 7 位)
128 10000000
256 100000000(1 在第 9 位)
512 1000000000
1024 10000000000(1 在第 11 位)

找一下規律: 4 的冪次方的數的二進制表示 1 的位置都是在奇數位圖片

以前在小吳的文章中判斷一個是是不是 2 的冪次方數使用的是位運算 n & ( n - 1 )。一樣的,這裏依舊可使用位運算:將這個數與特殊的數作位運算。

這個特殊的數有以下特色:

  • 足夠大,但不能超過 32 位,即最大爲 1111111111111111111111111111111( 31 個 1)
  • 它的二進制表示中奇數位爲 1 ,偶數位爲 0

    符合這兩個條件的二進制數是:

1010101010101010101010101010101

若是用一個 4 的冪次方數和它作與運算,獲得的仍是 4 的冪次方數

將這個二進制數轉換成 16 進製表示:0x55555555 。有沒有感受逼格更高點。。。

圖片描述

代碼實現

class Solution {
    public boolean isPowerOfFour(int num) {
        if (num <= 0)
            return false;
        //先判斷是不是 2 的冪
        if ((num & num - 1) != 0)
            return false;
        //若是與運算以後是自己則是 4 的冪
        if ((num & 0x55555555) == num)
            return true;
        return false;
    }
}

❤️ 看完三件事:

若是你以爲這篇內容對你挺有啓發,我想邀請你幫我三個忙:

  • 點贊,讓更多的人也能看到這篇內容(收藏不點贊,都是耍流氓 -_-)
  • 關注我和專欄,讓咱們成爲長期關係
  • 關注公衆號「五分鐘學算法」,第一時間閱讀最新的算法文章,公衆號後臺回覆 1024 送你 50 本 算法編程書籍。
相關文章
相關標籤/搜索