剑指 Offer II 003. 前 n 个数字二进制中 1 的个数

在这里插入图片描述

思路:
(1)可以使用暴力破解法,对于每一个数,因为它的二进制位数是一定的,再遍历32次,统计1的次数,就可以统计出每一个整数的二进制中的1的次数了。

class Solution {
    
    
public:
    int countOnes(int x) {
    
    
        int ones = 0;
        while (x > 0) {
    
    
            x &= (x - 1);
            ones++;
        }
        return ones;
    }

    vector<int> countBits(int n) {
    
    
        vector<int> bits(n + 1);
        for (int i = 0; i <= n; i++) {
    
    
            bits[i] = countOnes(i);
        }
        return bits;
    }
};

(2)如果一个正整数i是一个偶数,那么如果将它二进制数右移一位,就等于求得了它i/2。一个数i如果它是偶数,它的二进制数中1的次数等于i/2的二进制数中1的个数。如果数是奇数,那么它会多1。所以如果我们逐步从0开始,就能逐步得出结果了。这个方法也有点像经验法找规律。

vec[i] = vec[i >> 1] + (i & 1);
i >> 1等于就是求i/2,i&1就是求它是偶数还是奇数,这里很巧。

class Solution {
    
    
public:
    vector<int> countBits(int n)
    {
    
    
        vector<int>vec(n+1,0);
        for (int i = 1;i <= n;i++)
        {
    
    
            vec[i] = vec[i >> 1] + (i & 1);
        }
        return vec;
    }
};

猜你喜欢

转载自blog.csdn.net/daweq/article/details/129953328