1. 程式人生 > 實用技巧 >劍指 Offer 15. 二進位制中1的個數

劍指 Offer 15. 二進位制中1的個數

  • 題目描述

請實現一個函式,輸入一個整數,輸出該數二進位制表示中 1 的個數。例如,把 9表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。

示例 1:

輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進位制串 00000000000000000000000000001011中,共有三位為 '1'。
示例 2:

輸入:00000000000000000000000010000000
輸出:1
解釋:輸入的二進位制串 00000000000000000000000010000000中,共有一位為 '1'。
示例 3:

輸入:11111111111111111111111111111101
輸出:31
解釋:輸入的二進位制串 11111111111111111111111111111101 中,共有 31 位為 '1'。

  • 解法一:逐位判斷

一開始以為題目的輸入是一個十進位制數,看測試用例是一個無符號的二進位制數。

這裡可以想到對二進位制數的處理:我們可以從右往左找1的個數

  1. 若n & 1 = 0,則二進位制最後一位為0
  2. 若 n & 1 = 1,則二進位制最後一位為1

根據此特性,可以迴圈判斷n的最後一位是1 還是 0,此時為了每次判斷n的最後一位,需要將n進行右移操作:n >> 1

程式碼:(時間複雜度O(log2 n),n代表最高位1所在位數)

def hammingWeight(self, n: int) -> int:
        res = 0
        while n:
            res += n & 1 # n與1相與,,為0的話最後一位為0,為1的話最後一位為1
n >>= 1 #右移 return res
  • 解法二:用n&(n-1)

找 n & (n -1)特性:

(n−1) 解析: 二進位制數字 nn 最右邊的 11 變成 00 ,此 11 右邊的 00 都變成 11 。

n \& (n - 1)n&(n−1) 解析: 二進位制數字 nn 最右邊的 11 變成 00 ,其餘不變。

看圖就懂了

程式碼:時間複雜度O(M)(M為二進位制中1的個數)

    def hammingWeight(self, n: int) -> int:
        res 
= 0 while n: res += 1 # 此時肯定存在1個1 n = n & (n-1) #將從右往左數第一個1消掉 return res

逐位判斷