You need to enable JavaScript to run this app. 为什么我的JS逐位平方拼接函数偶尔会对数字执行两次平方运算?
优惠活动
大模型
产品
解决方案
定价
更多

为什么我的JS逐位平方拼接函数偶尔会对数字执行两次平方运算?

问题根因定位
  • 你在遍历intDigits数组的过程中直接修改原数组的元素值,同时使用indexOf(x)获取当前元素索引,indexOf永远返回数组中第一个匹配值的索引,当修改后的值和数组中未处理的元素值重复时,就会错误定位到已经处理过的元素,导致该位置被重复平方。

以你测试的squareDigits(24)为例,执行过程如下:

  1. 初始intDigits = [2,4]
  2. 第一次遍历拿到x=2,indexOf(2)返回0,把索引0位置改成2²=4,数组变为[4,4]
  3. 第二次遍历拿到x=4(数组的第二个元素),indexOf(4)返回第一个匹配的索引0,把索引0位置的4改成4²=16,数组变为[16,4]
  4. 最后拼接得到164,和预期的44不符,这就是你说的2被平方两次的原因。
修复方案

方案1:使用map直接生成处理后的数组(推荐)

function squareDigits(num){
  return parseInt(
    (""+num).split("")
      .map(digit => parseInt(digit) ** 2)
      .join("")
  );
}

console.log(squareDigits(24)); // 输出44,符合预期
console.log(squareDigits(3214)); // 输出94116,符合预期

方案2:如果要保留原遍历逻辑,通过索引遍历避免定位错误

function squareDigits(num){
  let digits = (""+num).split("");
  let intDigits = [];
  
  for (x of digits) {
    intDigits.push(parseInt(x));
  }
  // 按索引遍历,不需要用indexOf动态定位
  for (let i = 0; i < intDigits.length; i++) {
    intDigits[i] = intDigits[i] * intDigits[i];
  }
 
  return parseInt(intDigits.join(""));
}

内容的提问来源于stack exchange,提问作者Garrett Harty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 18:06:10