leetcode link : https://leetcode.cn/problems/counting-bits/description/?envType=problem-list-v2&envId=2cktkvj&
给你一个整数 n
,对于 0 <= i <= n
中的每个 i
,计算其二进制表示中 1
的个数 ,返回一个长度为 n + 1
的数组 ans
作为答案。
示例 1:
输入:n = 2 输出:[0,1,1] 解释: 0 --> 0 1 --> 1 2 --> 10
O(nlogn)解法:
- 1 for循环从0到n遍历数字
- 2.1 先记录余(余为1的数量就是二进制中1的个数)
- 2.2 再记录商2 对数字i进行循环除以2,记录其余和商。
class Solution {
public:
vector<int> countBits(int n) {
vector<int> result;
for(int i=0; i<=n; i++){
int sum = 0;
int j = i, k;
while(j){
k = j % 2;
j = j / 2;
sum += k;
}
result.push_back(sum);
}
return result;
}
};
O(n)解法:
- 1 考虑奇偶性。
- 1.1 奇数中1的个数 = 前面偶数1的个数 + 1
- 1.2 偶数中1的个数 = 偶数/2的个数
class Solution {
public:
vector countBits(int n) {
vector result(n+1);
result[0] = 0;
if (n == 0) return result;
for(int i=1; i<=n; i++){
if (i%2 == 1) result[i] = result[i-1]+1;
else result[i] = result[i/2];
}
return result;
}
};