问题描述:
- 给定一个非负整数
n
,计算0
到n
之间的每个数字的二进制表示中1
的个数,并输出一个数组。
核心思路:
- 该题考查位运算。
- 假设要确定
4
的二进制表示中1
的个数,可以通过确定2
的二进制表示中1
的个数,这是因为4 = 2 << 1
,因而4
和2
的二进制表示中1
的个数都是一样的。 - 而
5
可以分解成4 + 1
,即5 = 4 + 1 = 2 << 1 + 1
。
- 假设要确定
- 利用动态规划的解法来做即可,给定一个非负整数
n
,则创建一个大小为n+1
的数组ans
用来记录每个数字的二进制表示中1
的个数,而ans[i]
的状态只由ans[i/2]
确定。
代码实现:
class Solution
{
public:
vector<int> countBits(int n)
{
vector<int> ans(n+1);
for(int i = 0; i <= n; ++i)
ans[i] = ans[i/2] + (i&1);
return ans;
}
};