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

JS数组平方校验函数问题排查:为何判断结果不符合预期?

问题排查与代码修正:检查数组是否为另一数组元素的平方集合

核心问题

你的代码逻辑思路是对的,但数组比较方式错误:在JavaScript中,数组属于引用类型,==运算符比较的是两个数组的内存引用地址,而非数组内容。哪怕两个数组的元素、顺序完全一致,只要是不同的数组实例,==比较都会返回false,这就是你运行结果不符合预期的原因。

另外,原代码没有处理两个数组长度不一致的边界情况,比如nums长度为3、target长度为4时,即使平方后的元素和target部分匹配,也应该直接返回false。

修正后的代码方案

方案一:排序后逐个元素比较(推荐)

先对两个数组分别排序,再通过every方法逐个校验元素是否一致,同时提前判断数组长度:

function compareSqr(nums, target) {
  // 边界校验:长度不同直接返回false
  if (nums.length !== target.length) return false;
  
  // 生成平方数组并排序
  const squaredNums = nums.map(num => num * num).sort((a, b) => a - b);
  // 目标数组同样排序
  const sortedTarget = target.sort((a, b) => a - b);
  
  // 逐个比较对应位置的元素
  return squaredNums.every((value, index) => value === sortedTarget[index]);
}

// 测试用例
console.log(compareSqr([1, 2, 3, 4], [1, 4, 9, 16])); // 输出 true
console.log(compareSqr([1, 2, 2], [1, 4, 4])); // 输出 true
console.log(compareSqr([1, 2], [1, 4, 9])); // 输出 false
console.log(compareSqr([3, 1], [1, 9])); // 输出 true

方案二:转字符串比较(简洁版)

将排序后的数组转为字符串,通过字符串相等来判断数组内容一致,适合纯数字场景:

function compareSqr(nums, target) {
  if (nums.length !== target.length) return false;
  
  const squaredStr = nums.map(num => num * num).sort((a, b) => a - b).join(',');
  const targetStr = target.sort((a, b) => a - b).join(',');
  
  return squaredStr === targetStr;
}

关键说明

  • 排序时必须传入(a, b) => a - b作为sort的参数,否则JavaScript默认会按字符串Unicode码点排序,导致数字排序错误(比如10会排在2前面)。
  • 提前校验数组长度可以避免不必要的排序和比较操作,提升代码效率。

内容的提问来源于stack exchange,提问作者Sougata Mukherjee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 07:59:59