力扣-338-比特位计数

题目描述:求一个非负数的二进制表示下1的个数。

分析:这道题首先想到的是用位运算来做,LeetCode上还有其他的做法。

如果x的最右一位为1,那么x&(x-1)就是将x的最后一个1去掉。eg:x = (101)2,x&(x-1)=(100)2 。;可以看出x中1的个数比x(x-1)中1的个数多一个;如果最后一位不是1的话怎么办,eg:x=(110)2  ,x&(x-1)=110&101=100。结论还是成立的。那么我们就可以从小到大依次递推求解了。
class Solution {
    public int[] countBits(int num) {
        int[] res = new int[num + 1];    //共有num+1个数
        res[0] = 0;
        for(int i = 1; i <= num; i++) {
            res[i] = res[i&(i-1)] + 1;
        }
        return res; 
    }
}

 

还有一种思路:如果x最后一位是1,那么x>>1位后,最低位的1移去后,最高位补0。那么x中1的个数,等于x>>1中1的个数再加1;如果x的最后一位不是1,那么x和x>>1中1的个数相同。

class Solution {
    public int[] countBits(int num) {
        int[] res = new int[num + 1];    //共有num+1个数
        res[0] = 0;
        for(int i = 1; i <= num; i++){
            if((i&1) == 1){
                res[i] = res[i>>1] + 1;
            }else{
                res[i] = res[i>>1];
            }
        }
        return res; 
    }
}

 

posted @ 2020-10-10 10:08  Peterxiazhen  阅读(109)  评论(0编辑  收藏  举报