338. 比特位计数

111 阅读1分钟

题目介绍

力扣338题:leetcode-cn.com/problems/co…

image.png

分析

对于所有的数字,只有两类:

  • 奇数:二进制表示中,奇数一定比前面那个偶数多一个 1,因为多的就是最低位的 1。

    举例:

0 = 0 ,1 = 1 , 2 = 10,3 = 11

  • 偶数:二进制表示中,偶数中 1 的个数一定和除以 2 之后的那个数一样多。因为最低位是 0,除以 2 就是右移一位,也就是把那个 0 抹掉而已,所以 1 的个数是不变的。

    举例:

2 = 10,4 = 100,6 = 110,8 = 1000

另外,0 的 1 个数为 0,于是就可以根据奇偶性开始遍历计算了。

代码如下:

class Solution {
    public int[] countBits(int num) {
      int[] result = new int[num + 1];
      for(int i = 1; i <= num; i++){
        if ((i & 1) == 0){
          //偶数二进制1的个数跟右移一位1的个数一样
          result[i] = result[i >> 1];
        }else {
          //奇数二进制1的个数等于偶数二进制1的个数 + 1
          result[i] = result[i - 1] + 1;
        }
      }
      return result;
    }
}