題目描述
請實現一個函數,輸入一個整數,輸出該數二進制表示中 1 的個數。例如,把 9 表示成二進制是 1001,有 2 位是 1。因此,如果輸入 9,則該函數輸出 2。
示例
示例 1:
輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進制串 00000000000000000000000000001011 中,共有三位為 '1'。
示例2:
輸入:00000000000000000000000010000000
輸出:1
解釋:輸入的二進制串 00000000000000000000000010000000 中,共有一位為 '1'。
示例3:
輸入:11111111111111111111111111111101
輸出:31
解釋:輸入的二進制串 11111111111111111111111111111101 中,共有 31 位為 '1'。
解答方法
方法一:位運算
思路
- 初始化數量統計變量 res = 0 。
- 循環逐位判斷: 當 n = 0時跳出。
- res += n & 1 : 若 n& 1 = 1(末位為1) ,則統計數 res 加一。
- n >>= 1 : 將二進制數字 n 無符號右移一位 。
- 返回統計數量 res。
代碼
class Solution:
def hammingWeight(self, n: int) -> int:
res = 0
while n:
res += n&1
n >>= 1
return res
時間復雜度
O(log n) : 此算法循環內部僅有 移位、與、加 等基本運算,占用 O(1) ;逐位判斷需循環 logn次,其中 logn代表數字 n 最高位 11的所在位數(例如 log 4 = 2、log16 = 4)。
空間復雜度
O(1) : 變量 res使用常數大小額外空間。
方法二:n&(n-1)
思路
一個數 n 與一個比它小 1 的數(n?1)進行與運算(&)之后,得到的結果會消除 n 中最低位的 1.
代碼
class Solution:
def hammingWeight(self, n: int) -> int:
res = 0
while n:
res +=1
n = n&(n-1)
return res
時間復雜度
O(M): n&(n?1) 操作僅有減法和與運算,占用 O(1) ;設 MM 為二進制數字 n 中 1 的個數,則需循環 M 次(每輪消去一個 1 ),占用 O(M) 。
空間復雜度
O(1) : 變量 res 使用常數大小額外空間。