方法一: 遍历
位运算,逐个位遍历,累计值为1的位。
时间复杂度:$O(N)$
class Solution {
public:
int hammingWeight(uint32_t n) {
int cnt = 0, i = 32;
while (i -- ) //32位循环32次
{
if (n & 1) cnt ++ ; //判断最低位是否为1
n >>= 1; //n每次向右移动一位,即除以2
}
return cnt;
}
};
方法二:lowbit
每次找到最低位的1,减去该位的1后再找,直到不存在值为1的位。
时间复杂度为1的个数,即小于等于 $O(N)$
class Solution {
public:
int hammingWeight(uint32_t n) {
int cnt = 0;
while (n)
{
int lowbit = n & (-n); //只要n不为0,lowbit的值就不为0
n -= lowbit; //减去当前1所在的位
cnt ++ ;
}
return cnt;
}
};
注:
n & (-n)
:取得最低位的1所代表的值;
n & (n - 1)
:直接减去n中最低位的1。
算法二while循环中也可以写成 n=n&(n-1) 每次消去最低位的1,直到消完
对对,剑指offer上也是用的这个写法。
$NB$