338.Counting Bits


描述

Given an integer n, return an array ans of length n + 1 such that for each i (0 <= i <= n), ans[i] is the number of 1’s in the binary representation of i.

给定一个整数 n,返回一个长度为 n + 1 的数组 ans,使得对于每个 i (0 <= i <= n),ans[i] 是 i 的二进制表示中 1 的数量。

测试用例

Input: n = 2 
Output: [0,1,1]
Explanation:
0 --> 0 # 0个1
1 --> 1 # 1个1
2 --> 10 # 1个1

Input: n = 5
Output: [0,1,1,2,1,2]
Explanation:
0 --> 0 # 0个1
1 --> 1 # 1个1
2 --> 10 # 1个1
3 --> 11 # 2个1
4 --> 100 # 1个1
5 --> 101 # 2个1

题解

&运算符(按位与)

以特定的方式的方式组合操作数中对应的位 如果对应的位都为1,那么结果就是1, 如果任意一个位是0 则结果就是0。

# 1 & 3的结果为1
1的二进制表示为 0 0 0 0 0 0 1
3的二进制表示为 0 0 0 0 0 1 1
根据 & 的规则 得到的结果为 0 0 0 0 0 0 0 1,十进制表示就是1

n - 1

一个二进制的数减1,就是将这个二进制最右边的那个1变成0,然后它后边的所有位置都变成1(即将最右边的那个1和后面的所有数反转)。

举例:0011 0100,减1,(n-1)后变成:0011 0011

所以n & (n - 1)会将有0的位置都变成0,所以就是在原来的基础上去掉了一个1(最右边的那个1)。

0011 0100 & 0011 00110011 0000

代码

var countBits = function(n) {
    let count = 0, ans = [];
    for(let i = 0; i <= n; i++) {
        let j = i;
        while(j) {
            count++;
            j &= (j - 1);
        }
        ans.push(count);
        count = 0;
    }
    return ans
};

结果

Accepted

15/15 cases passed (92 ms)

Your runtime beats 92.07 % of javascript submissions

Your memory usage beats 44.7 % of javascript submissions (45.2 MB)


文章作者: 阿汪同学
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 阿汪同学 !
评论
  目录