LeetCode位1的个数:数字参数转字符串拆分失败的原因与解决
问题原因解析
- 你传入的
0000011110在JavaScript里不是二进制数字,而是八进制字面量——数字开头带0时,JS会默认按八进制解析(除非加0b前缀明确表示二进制)。这个八进制数转十进制是3616,所以String(n)或n.toString()得到的是十进制字符串"3616",拆分后自然不是你要的二进制字符数组。 - 另外,
String.fromCharCode(...n.split(''))完全无效,因为n是数字类型,根本没有split方法,执行这行代码会直接报错。
正确实现方式
场景1:参数是二进制格式的字符串(比如"0000011110")
如果传入的是字符串形式的二进制数,直接拆分统计1的数量即可:
function countBits(str) { return str.split('').filter(char => char === '1').length; } countBits("0000011110"); // 返回4
场景2:参数是数字(统计其二进制中1的个数)
如果传入的是数字,正确做法分两种,推荐用位运算(LeetCode题更高效):
方法1:转二进制字符串统计
用n.toString(2)把数字转成二进制字符串,需要补全前导零的话用padStart(比如LeetCode要求处理32位无符号整数):
function hammingWeight(n) { const binaryStr = n.toString(2).padStart(32, '0'); return binaryStr.split('').filter(char => char === '1').length; } // 先把二进制字符串转成数字再传入 hammingWeight(parseInt("0000011110", 2)); // 返回4
方法2:位运算高效解法(推荐)
通过位运算直接操作二进制位,避免字符串处理的开销:
function hammingWeight(n) { let count = 0; while (n) { // 每次消除最右边的1,计数加1 n &= n - 1; count++; } return count; } hammingWeight(parseInt("0000011110", 2)); // 返回4
额外提示
如果必须直接用0000011110这种写法传参,要在前面加0b前缀,明确告诉JS这是二进制数字:0b0000011110,解析后是十进制的30,转二进制字符串是"11110",统计1的个数为4。
内容的提问来源于stack exchange,提问作者user5481714
相关产品推荐
相关产品推荐

