請實現一個函數,輸入一個整數(以二進制串形式),輸出該數二進制表示中 1 的個數。例如,把 9 表示成二進制是 1001,有 2 位是 1。因此,如果輸入 9,則該函數輸出 2。
根據位運算的方式, 0 或者 1 & 1得到的結果和原來的數一致,我們可以通過不斷的左移數字n,根據最右位上 & 1,判斷是否是1。
右移n算法:
func hammingWeight(_ n: Int) -> Int {
var n = n
var res = 0
while n != 0 {
if n & 1 == 1 {
res += 1
}
n = n >> 1
}
return res
}
算法二: n&(n-1)
- (n?1) : 二進制數字 n 最右邊的數如果是 1 則變成 0,其它不變 。如果是0,則 n 最右邊的1的變成0,1 右邊的 0 都變成 1 。1001 - 1 = 1000, 1100 - 1 = 1011。
- n&(n?1) : 二進制數字 n 最右邊的 1 變成 0 ,其余不變。1001 & 1000 = 1000,1100 & 1011 = 1000。
func hammingWeight(_ n: Int) -> Int{
var n = n
var res = 0
while n != 0{
res += 1
n &= n - 1
}
return res
}
算法的時間復雜度: O(M),其中M表示二進制數字 n 中 1 的個數,則需循環 M 次(每輪消去一個 1 )。