You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:36:32