使用嵌套for循环实现sumArray函数遇测试失败,求排查修正
问题排查与代码修正
核心错误分析
你的代码存在三个关键问题,导致无法通过测试用例:
- 错误比较对象:代码中
i + j === n是将循环索引相加,而非数组元素相加。题目要求的是数组中两个元素的和等于目标值,应该用array[i] + array[j] === n。 - 过早终止判断:内层循环中只要第一次判断不满足就直接
return false,导致函数还没遍历完所有可能的元素组合就终止。比如你的测试用例中,i=0、j=0时不满足条件,函数直接返回false,根本没机会检查到array[0]+array[4] = 2+11=13这个符合条件的组合。 - 重复冗余检查:内层循环j从0开始会重复检查同一对元素(比如i=0,j=4和i=4,j=0),既浪费性能,还需要额外判断索引是否不同。
修正后的基础版本
这个版本修复了核心错误,确保遍历所有可能的元素组合:
function sumArray(array, n) { for(var i = 0; i < array.length; i++){ for(var j = 0; j < array.length; j++){ // 先确保是不同元素,再判断和是否等于目标值 if(i !== j && array[i] + array[j] === n){ return true; } } } // 所有组合检查完毕后再返回false return false; };
优化版本(推荐)
通过调整内层循环的起始位置,避免重复检查,同时省去索引判断,提升性能:
function sumArray(array, n) { for(var i = 0; i < array.length; i++){ // j从i+1开始,只检查当前元素之后的元素,避免重复组合 for(var j = i + 1; j < array.length; j++){ if(array[i] + array[j] === n){ return true; } } } return false; };
这个优化版本中,j始终大于i,所以array[i]和array[j]必然是两个不同的元素,无需额外判断索引是否相等,同时循环次数减少了一半,效率更高。
内容的提问来源于stack exchange,提问作者Esteban Descouvieres
相关产品推荐
相关产品推荐

