0338. Counting Bits

0338. Counting Bits #

题目 #

  • 给定一个整数 n,对于 0 <= i <= n 中的每个 i,计算其二进制表示中 1 的个数,返回一个长度为 n+1 的数组 ans 作为答案。

思路 #

右移计数 #

Brian Kernighan #

动态规划 #

代码 #

右移计数 #

class Solution {
    public int count(int num) {
        int result = 0;
        for (int i = 30; i >= 0; i--) {
            if (((num >> i) & 1) == 1) result += 1;
        }
        return result;
    }
    public int[] countBits(int n) {
        int[] ans = new int[n + 1];
        for (int i = 0; i <= n; i++) {
            ans[i] = count(i);
        }
        return ans;
    }
}

Brian Kernighan #

class Solution {
    public int count(int num) {
        int ans = 0;
        while (num > 0) {
            num &= num - 1;
            ans += 1;
        }
        return ans;
    }
    public int[] countBits(int n) {
        int[] ans = new int[n + 1];
        for(int i = 0; i <= n; i++) ans[i] = count(i);
        return ans;
    }
}

动态规划 #

class Solution {
    public int[] countBits(int n) {
        int[] ans = new int[n + 1];
        int pow = 1;
        for (int i = 1; i <= n; i++) {
            if (i == pow) {
                ans[i] = 1;
                pow *= 2;
            }
            else {
                ans[i] = 1 + ans[i - pow/2];
            }
        }
        return ans;
    }
}