问题:给你一个整数 `n` ,对于 `0 <= i <= n` 中的每个 `i` ,计算其二进制表示中 `1` 的个数 ,返回一个长度为 `n + 1` 的数组 `ans` 作为答案。
知识点:x&=x-1代表将x最后一个1变为0,因此,当x&x-1=0时,代表x最高位为1,其余位为0
nlogn解法:
class Solution {
public:
int Ones(int x) {
int ones = 0;
while (x > 0) {
x &= (x - 1);
ones++;
}
return ones;
}
vector<int> countBits(int n) {
vector<int> s(n + 1);
for (int i = 0; i <= n; i++) {
s[i] = Ones(i);
}
return s;
}
};
logn解法:
class Solution {
public:
vector<int> countBits(int n) {
vector<int> s(n + 1);
int h = 0;
for (int i = 1; i <= n; i++) {
//观察发现,要想求出一个数的1的个数,只需要找到比他小的,和他只有一个1不一样的就行了。
//显然,先求出最高位1其余位不为1数x,减去x即可
if ((i & (i - 1)) == 0) {
h = i;
}
s[i] = s[i - h] + 1;
}
return s;
}
};