给定一个非负整数 n。对于 0 ≤ i ≤ n 对于范围中的每个数字 i,计算其二进制数中的 1 的数目并将它们作为数组返回。
样例输入:7
样例输出:[ 0 , 1 , 1 , 2 , 1 , 2 , 2 , 3 ]
案例思路:
0 1 2 3 4 5 6 7
0 1 1 2 1 2 2 3
#include <iostream>
#include <vector>
using namespace std;
/*
1 1
2 1
3 2
4 1
5 2
6 2
7 3
8 1
9 2
10 2
11 3
12 2
13 3
14 3
15 4
每一组的个数对应的是1 2 4 8
1 变为1 2
1 2 变为 1 2 2 3
1 2 2 3变为 1 2 2 3 2 3 3 4
*/
class Solution
{
public:
vector<int> countBits(int n) //3
{
vector<int> bitCount;
bitCount.reserve(n + 1); //设置bitCount容器比提供的数大一,因为里面还有0么
for (int i = 0; i < n + 1; ++i)
{
bitCount.push_back(-1); //将容器中的数全部存放为-1
}
bitCount[0] = 0; //应为第一个数一定是0,而按照规则0对应的就是0
if (n == 0)
{
return bitCount;
}
bitCount[1] = 1; //理由同上
if (n == 1)
{
return bitCount;
}
//这个就是算法了
for (int i = 1;; ++i)
{
int flag = 0;
for (int j = 1 << i; j < (1 << i + 1); ++j) //1<<i代表的是2的i次方
{
//第一次循环 j为 2 到 4之间
//第二次循环 j为 4 到 8之间
// j 2 3
if (j < (1 << i) + (1 << i - 1))
{
bitCount[j] = bitCount[j - (1 << i - 1)];
}
else
{
bitCount[j] = bitCount[j - (1 << i - 1)] + 1;
}
if (j >= n) //内循环退出条件为j>n
{
flag = 1;
break;
}
}
if (flag)
{
break;
}
}
return bitCount;
}
};
int main()
{
Solution s;
int n;
cin >> n;
vector<int> v = s.countBits(n);
cout << "-----" << endl;
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << endl;
}
return 0;
}
原文链接:https://blog.csdn.net/whereisherofrom/article/details/119099175