背景
这是一个风和日丽的早晨,群里突然开始了一轮的解题solo,这个题目在大家的发散下得到了不少简单的方案,和大家分享一下。
题目介绍
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数。
方案一
采用的是位运算,将二进制数向右挪一位 >>=
,这个地方可以这么去理解
let a = 5; // 对应的二进制数 => 00000000000000000000000000000101
// 将a向右挪2位
a >>= 2; // 00000000000000000000000000000001
通过上边的操作得到a == 1
,所以同学a就是运用了这点,通过while不断的将二进制数向右挪动,每一次通过按位与运算&
判断当前是否为1,并记录a的个数
var hammingWeight = function(n) {
let count = 0;
while(n){
if(n&1) {
count++;
}
n >>= 1;
}
return count;
};
方案二
采用的是字符串转数组的方式,在统计数组的长度即可计算,这里要注意的是:match方式获得的是一个迭代器,需要转换一下。
Array.from((15).toString(2).matchAll(/1/g), x => +x).length
这边主要就是先把数字转成字符串,然后通过正则匹配出数字1,再计算数组长度
方案三
这个方案我觉得更加简单,单纯通过字符串替换,然后直接通过length熟悉获得数量
(15).toString(2).replace(/0/g,'').length
总结
以上集中方案,包含了位运算,数组,字符串,不知道大家还可以怎么处理呢?