关于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
};

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理