LeetCode 第 231 號問題:2 的冪

本文首發於公衆號「五分鐘學算法」,是圖解 LeetCode 系列文章之一。c++

我的網站:www.cxyxiaowu.comgit

題目來源於 LeetCode 上第 231 號問題:2 的冪。題目難度爲 Easy,目前經過率爲 45.6% 。github

題目描述

給定一個整數,編寫一個函數來判斷它是不是 2 的冪次方。算法

示例 1:bash

輸入: 1
輸出: true
解釋: 2^0 = 1
複製代碼

示例 2:函數

輸入: 16
輸出: true
解釋: 2^4 = 16
複製代碼

示例 3:網站

輸入: 218
輸出: false
複製代碼

題目解析

首先,先來分析一下 2 的次方數的二進制寫法:spa

表格

仔細觀察,能夠看出 2 的次方數都只有一個 1 ,剩下的都是 0 。根據這個特色,只須要每次判斷最低位是否爲 1 ,而後向右移位,最後統計 1 的個數便可判斷是不是 2 的次方數。code

代碼很簡單:cdn

class Solution {
public:
    bool isPowerOfTwo(int n) {
        int cnt = 0;
        while (n > 0) {
            cnt += (n & 1);
            n >>= 1;
        }
        return cnt == 1;
    } 
};
複製代碼

該題還有一種巧妙的解法。再觀察上面的表格,若是一個數是 2 的次方數的話,那麼它的二進數必然是最高位爲1,其它都爲 0 ,那麼若是此時咱們減 1 的話,則最高位會降一位,其他爲 0 的位如今都爲變爲 1,那麼咱們把兩數相與,就會獲得 0。

好比 2 的 3 次方爲 8,二進制位 1000 ,那麼 8 - 1 = 7,其中 7 的二進制位 0111。

圖片描述

代碼實現

利用這個性質,只需一行代碼就能夠搞定。

class Solution {
public:
    bool isPowerOfTwo(int n) {
        return (n > 0) && (!(n & (n - 1)));
    } 
};
複製代碼

相關文章
相關標籤/搜索