1. 程式人生 > >leetcode——用位運算來做2的冪次方和位元位計數問題

leetcode——用位運算來做2的冪次方和位元位計數問題

231.給定一個整數,編寫一個函式來判斷它是否是 2 的冪次方。

示例 1:

輸入: 1
輸出: true
解釋: 20 = 1
示例 2:

輸入: 16
輸出: true
解釋: 24 = 16
示例 3:

輸入: 218
輸出: false

思路:
可以用mod去摸運算來做,也可以用 l o g 2

log_{2} 得到int數

但是最快捷的方法還是用位運算,因為不管是2的多少次方,變成二進位制的時候都只有1個1,其他位數都是0.那麼就可以用x!=0 && (x & (x-1))==0 來消除後面的1.

程式碼:

class Solution(object):
    def isPowerOfTwo(self, n):
        """
        :type n: int
        :rtype: bool
        """
        return n > 0 and not (n & n-1)

338.給定一個非負整數 num。對於 0 ≤ i ≤ num 範圍中的每個數字 i ,計算其二進位制數中的 1 的數目並將它們作為陣列返回。

示例 1:

輸入: 2
輸出: [0,1,1]
示例 2:

輸入: 5
輸出: [0,1,1,2,1,2]
思路:
count[n+1]這麼一個範圍,對於i=0到n,count[n] = count[i&(i-1)]+1,相當於斐波那契數列計算前繼結點。

class Solution(object):
    def countBits(self, num):
        """
        :type num: int
        :rtype: List[int]
        """
        res = [0 for i in range(num + 1)]
        for i in range(1,num+1):
            res[i] += res[i & (i-1)] +1
        return res