乐趣区

关于javascript:LeetCode位1的个数

起源:力扣(LeetCode)

编写一个函数,输出是一个无符号整数(以二进制串的模式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明分量)。

示例 1:

输出:00000000000000000000000000001011
输入:3
解释:输出的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

示例 2:

输出:00000000000000000000000010000000
输入:1
解释:输出的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

示例 3:

输出:11111111111111111111111111111101
输入:31
解释:输出的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。

提醒:输出必须是长度为 32 的 二进制串。

题意很简略,就是计算一个二进制串中有多少个位为 1

既然是二进制位,那咱们也是应用位运算来解题

办法一:循环查看二进制位

位的左移操作:<<

例如:1 << 2,示意将 1 左移两位,即 0001 => 0100,即为 4

console.log(1 << 2); // 4

console.log(1 << 5); // 32

还能够是其它位左移:

// 2 左移,0000 0010 => 0001 0000
console.log(2 << 3);  // 16

// 3 左移,0000 0011 => 0001 1000
console.log(3 << 3); // 24

按位与:&

咱们平时用最多预计就是 逻辑与 &&,所谓按位与就是二进制串: 全 1 为 1,有 0 则 0

console.log(0001 & 0010);  // 0

console.log(0001 & 0011);  // 0001 => 1

上面来看题解:

var hammingWeight = function(n) {
    let sum = 0;
    // 已知二进制串为 32 位
    for (let i = 0; i < 32; i++) {
        // 利用位左移来判断 n 相应的位是否为 1
        if ((n & (1<<i)) !== 0) {sum++}
    }
    return sum;
};

办法二:位运算

n & (n−1) 其运算后果总是把 n 的二进制位中的最低位的 1 变为 0 之后的后果

console.log(6 & (6 - 1));  // 5

6(0110)5(0101) => 6 & 5 = 0100

后果会把 6 的最低位的 1 变为 0,咱们能够计算 6 中有多少个 1

let sum = 0
let n = 6
while (n) {
    // 按位与运算,只有 n 不等于 0,阐明 n 中还有 1,一次打消一个 1,sum 就 +1
    n = n & (n - 1)
    sum++
}
console.log(sum);

有了下面的栗子,上面题解就简略了:

var hammingWeight = function(n) {
    let sum = 0;
    while (n) {
        n &= n - 1;
        sum++
    }
    return sum
};

退出移动版