劍指 Offer 15. 二進位制中1的個數
阿新 • • 發佈:2020-08-02
- 題目描述
請實現一個函式,輸入一個整數,輸出該數二進位制表示中 1 的個數。例如,把 9表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。
示例 1:
輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進位制串 00000000000000000000000000001011中,共有三位為 '1'。
示例 2:
輸入:00000000000000000000000010000000
輸出:1
解釋:輸入的二進位制串 00000000000000000000000010000000中,共有一位為 '1'。
示例 3:
輸入:11111111111111111111111111111101
輸出:31
解釋:輸入的二進位制串 11111111111111111111111111111101 中,共有 31 位為 '1'。
- 解法一:逐位判斷
一開始以為題目的輸入是一個十進位制數,看測試用例是一個無符號的二進位制數。
這裡可以想到對二進位制數的處理:我們可以從右往左找1的個數
- 若n & 1 = 0,則二進位制最後一位為0
- 若 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的話最後一位為1n >>= 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