338.比特位计数
链接:338.比特位计数
难度:Easy
标签:位运算、动态规划
简介:给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
题解 1 - typescript
- 编辑时间:2021-03-03
- 执行用时:120ms
- 内存消耗:50.4MB
- 编程语言:typescript
- 解法介绍:计算每一个只含一个 1 的数,进行批量填充。
function countBits(num: number): number[] {
  const ans = [0, 1];
  let max2 = 1;
  while (max2 < num) {
    max2 <<= 1;
    ans.push(...ans.map(v => v + 1));
  }
  ans.length = num + 1;
  return ans;
}
题解 2 - cpp
- 编辑时间:2021-12-23
- 执行用时:8ms
- 内存消耗:8.4MB
- 编程语言:cpp
- 解法介绍:当遇到 2 的指数幂后,从 0 开始重新遍历。
class Solution {
   public:
    vector<int> countBits(int n) {
        vector<int> ans;
        ans.push_back(0);
        if (n == 0) return ans;
        ans.push_back(1);
        if (n == 1) return ans;
        for (int num = 2, i = 0; num <= n; num++, i++) {
            if ((num & (num - 1)) == 0) i = 0;
            ans.push_back(ans[i] + 1);
        }
        return ans;
    }
};
题解 3 - typescript
- 编辑时间:2021-03-03
- 执行用时:156ms
- 内存消耗:44.4MB
- 编程语言:typescript
- 解法介绍:优化题解 2。
function countBits(num: number): number[] {
  if (num === 0) return [0];
  const ans = [0, 1];
  for (let i = 2; i <= num; i++) ans[i] = ans[~~(i / 2)] + (i & 1);
  return ans;
}
题解 4 - typescript
- 编辑时间:2021-03-03
- 执行用时:284ms
- 内存消耗:48.7MB
- 编程语言:typescript
- 解法介绍:计算每一个数的 1 位。
function countBits(num: number): number[] {
  return new Array(num + 1).fill(0).map(
    (_, i) =>
      i
        .toString(2)
        .split('')
        .filter(v => v === '1').length
  );
}