题目

图片.png
图片.png

题解

100000 -> 1
100001 -> 2

100 -> 1
101 -> 2

可见这是个循环 , 并且以开头为1的二进制整数开始

通过逐位相与得出1000这样的数bithight ;

之后就是 典型的一维动态规划 bits[i] = bits[i - bithight] + 1; 下一位等于上一位的处理之后的结果

  1. class Solution {
  2. public:
  3. vector<int> countBits(int n) {
  4. vector<int> bits(n + 1);
  5. int bithight = 0;
  6. for (int i = 1; i <= n; i++)
  7. {
  8. if ((i&(i - 1)) == 0) {
  9. bithight = i;
  10. }
  11. bits[i] = bits[i - bithight] + 1;
  12. }
  13. return bits;
  14. }
  15. };