原题
思路
- 动态规划、位运算
- 观察二进制数就可以知道,除了0的二进制数首位为0,其他二进制数首位都为1。所以bits[i] = bits[i<<1] +1;但后来在实现动态规划的时候发现i<<1还没有生成,所以只能通过bits[i] = bits[i>>1] + i&1来算。例如bits[110] = bits[11] + (110&001);后面的部分是为了获得最后一位是0还是1
代码
class Solution {
public:
vector<int> countBits(int n) {
vector<int> bits(n+1);
bits[0] = 0;
for (int i = 1; i <= n; i++) bits[i] = bits[i>>1] + (i & 1);
return bits;
}
};
运行截图
收获
- 110>>1 = 11; 11<<1 = 110
- 位运算是个奇妙的东西!