今天觉得值得记录的题是15. 二进制中1的个数,题意如下:
首先最基础的思路肯定是遍历每一为,然后数1的个数。代码如下:
class Solution {
public:
int hammingWeight(uint32_t n) {
int ans=0;
while(n)
{
ans+=n&1;//n&1如果n最后一位为1的话值为1.
n>>=1;//n向右移一位
}
return ans;
}
};
时间复杂度:O(logN),n 代表数字 n 最高位 1 的所在位数。
主要是看到了一种眼前一亮思路。
·(n-1)是使最右边的1变成0,此1左边的0都变成1。
·n&(n-1)是使最右边的1变成0,其余不变。
所以我们可以用这种判断方法直接数每一位1。
c++代码如下:
class Solution {
public:
int hammingWeight(uint32_t n) {
int ans=0;
while(n)
{
n=n&(n-1);
ans++;
}
return ans;
}
};
时间复杂度:O(M)。M为1的个数。
参考资料:
·Krahets《面试题15. 二进制中 1 的个数(位运算,清晰图解)》