HackerRank Mini-Max Sum问题:JS函数求和结果异常排查
问题分析
你的代码存在两个核心问题:
- 循环缺少终止条件,当
skipIndex超过数组长度时,仍会持续执行,导致结果异常甚至无限循环; - 通过手动重置
i=0控制循环的方式逻辑混乱,容易出现计算遗漏(比如你提到的跳过元素2时的总和13没有被正确收集)。
你输出结果里少了13,就是因为skipIndex=1(跳过元素2)时,循环逻辑没有正确完成总和计算并推入结果数组。
修复方案
我们换一种更直观的思路:遍历数组的每一个索引,计算排除当前索引元素后的数组总和,把所有总和收集起来,最后再取最小和最大值。这种方式逻辑清晰,不容易出错。
修复后的代码如下:
function miniMaxSum(arr) { const results = []; // 先计算数组所有元素的总总和 const totalSum = arr.reduce((acc, num) => acc + num, 0); // 遍历每个元素,用总总和减去当前元素,得到跳过该元素后的总和 for (const num of arr) { results.push(totalSum - num); } const minSum = Math.min(...results); const maxSum = Math.max(...results); console.log(results); console.log(minSum, maxSum); // 如果需要返回结果可取消下面注释 // return [minSum, maxSum]; } console.log(miniMaxSum([1, 2, 3, 4, 5]));
代码解释
- 计算总总和:用
reduce方法快速算出数组所有元素的总和,这样不用每次重新遍历数组求和,只需要用总总和减去当前元素,就能得到跳过该元素后的4个元素的和,效率更高; - 生成结果数组:遍历数组中的每个元素,每次用总总和减去当前元素,得到的值就是跳过该元素后的总和,将这些值依次推入结果数组;
- 获取最小和最大值:用
Math.min和Math.max配合扩展运算符...,直接从结果数组中取出最小和最大值。
运行这段代码,结果数组会是[14, 13, 12, 11, 10],完全符合你的预期,同时也避免了原代码中的循环逻辑问题。
原代码问题的具体细节
回到你的原代码,当skipIndex=1时,理论上应该计算1+3+4+5=13并推入数组,但你的循环逻辑在重置i=0后,下一轮循环的skipIndex已经变成2,导致这个值被遗漏。而且当skipIndex达到5(数组长度)时,循环还会继续执行,计算所有元素的总和(15)并推入数组,这会导致结果数组出现多余的错误值。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

