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
相关产品推荐
相关产品推荐

