338. 比特位计数

228 阅读1分钟

一、题目描述:

给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。

示例 1:

输入:2
输出:[0,1,1]

示例 2:

输入:5
输出:[0,1,1,2,1,2]

二、思路分析:

思路一:

先考虑将一个数转成二进制数,可以使用m % 2来计算。再考虑将这个数中包含出现1的次数记录下来。完成一个数记录1次数后,再使用一个循环从0开始到输入的数,在循环中记录每个数值出现的次数。

思路二:

emmm,想不出来其他方法。看了官网的没看明白。

三、AC 代码:

方法一:

function countBits(num: number): number[] {
  let arr = [];
  let j;
  for (let i = 0; i <= num; i++) {
    j = 0;
    let m = i;
    while (m > 0) { // 一个数记录1出现的次数
      if (m % 2 === 1) j++;
      m = Math.floor(m / 2);
    }
    arr.push(j);
  }
  return arr;
}

方法二:

function countBits(num: number): number[] {
  let bits = new Array(num + 1).fill(0);
  let highBit = 1;
  for (let i = 1; i <= num; i++) {
    if (highBit * 2 === i) highBit = i;
    bits[i] = bits[i - highBit] + 1;
  }
  return bits;
}

四、总结:

此题主要考察二进制统计。

题目来源:leetcode。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情