338. 比特位计数
通过x&(x-1)运算 将x 的二进制表示的最后一个 1 变成 0。因此,对 x 重复该操作,直到 x 变成 0,则操作次数即为 x 的“一比特数”
比如
1&0=0
11&10=10 10&01=00
相当于奇数最后一位是1,偶数最后一位是0 二者相与就能把最后一个1变成0
不断相与直至没有1就能得到1的个数
class Solution {
public:
int countOnes(int x)
{
int count=0;
while(x>0)
{
x=x&(x-1);//该运算将 xx 的二进制表示的最后一个 1 变成 0
count++;
}
return count;
}
vector<int> countBits(int num) {
vector<int> ans(num+1);
for(int i=0;i<=num;++i)
{
ans[i]=countOnes(i);
}
return ans;
}
};
同理,根据奇数偶数的特性 我们可以得到动态规划方程
x如果是奇数 相较于x-1(偶数)不同就是最后一位为1 所以二进制中1的个数多1
即
if(x&1) dp[x]=dp[x-1]+1
如果x是偶数 则最后一位为0 右移一位即除以2对于1的个数没有改变
所以
else dp[x]=dp[x/2]
class Solution {
public:
vector<int> countBits(int num) {
vector<int> dp(num+1);
dp[0]=0;
for(int i=1;i<=num;++i)
{
if(i&1) dp[i]=dp[i-1]+1;
else dp[i]=dp[i/2];
}
return dp;
}
};