力扣第338题“比特位计数”的解题思路

参考代码:

 class Solution{
public int[] countBits(int num) {
        int[] res = new int[num + 1];
        for(int i = 1;i<= num;i++){  //注意要从1开始,0不满足
            res[i] = res[i & (i - 1)] + 1;
        }
        return res;
    }
}

大致思路:

找到数组中当前的i的二进制去掉了最右边的一个1的那个数,因为去掉了最右边的1,所以当前i中二进制的1的个数就等于去掉了最右边的一个1的那个数在数组中对应的1的个数(即res[i & (i - 1)])再加上1。i & (i - 1)可以去掉i最右边的一个1(如果有),因此 i & (i - 1)是比 i 小的,而且i & (i - 1)的1的个数已经在前面算过了,所以i的1的个数就是 i & (i - 1)的1的个数加上1。

具体实现:

创建一个长度为n+1的数组,从一开始,一直到n,计数每一个数的1的个数,并存进数组中

最后返回数组。

这题主要是计算二进制中1的个数,利用位运算符很好解决。

猜你喜欢

转载自blog.csdn.net/weixin_63994459/article/details/123586693