JavaScript计算五数取四求和的最值结果错误,求问题排查
四数求和的最小/最大值计算错误排查
需求说明
给定五个正整数,计算恰好取其中四个数求和得到的最小值和最大值,最终以空格分隔的两个长整数输出。
测试用例
- 输入:
7 69 2 221 8974 - 预期输出:
299 9271 - 实际输出:
299 9266
我的实现代码
function miniMaxSum(arr) { let panjang = arr.length, max = arr.slice(0, panjang-1), min = arr.slice(1, panjang), maxSum = max.reduce((total, item) => total+item), minSum = min.reduce((total, item) => total+item); process.stdout.write(`${maxSum} ${minSum}`); }
问题根源
你的代码逻辑完全错误——你默认取前四个元素的和当最大值,后四个元素的和当最小值,但正确逻辑应该是:
- 最大值 = 数组总和 - 数组中的最小元素(去掉最小的那个,剩下四个的和最大)
- 最小值 = 数组总和 - 数组中的最大元素(去掉最大的那个,剩下四个的和最小)
拿测试输入的数组[7,69,2,221,8974]举例:
- 你代码里的
max是前四个元素[7,69,2,221],求和得到的299其实是去掉最大元素8974后的最小值,刚好蒙对了最小值; - 而
min是后四个元素[69,2,221,8974],求和得到9266,这是去掉第一个元素7后的和,根本不是正确的最大值(正确最大值应该是去掉最小元素2后的和:7+69+221+8974=9271)。
修复后的代码
function miniMaxSum(arr) { const totalSum = arr.reduce((acc, num) => acc + num, 0); const smallestNum = Math.min(...arr); const largestNum = Math.max(...arr); const minSum = totalSum - largestNum; const maxSum = totalSum - smallestNum; process.stdout.write(`${minSum} ${maxSum}`); }
这个版本先计算数组所有元素的总和,再减去最大元素得到四数最小和,减去最小元素得到四数最大和,完全符合需求逻辑,代入测试输入会得到正确的299 9271。
内容的提问来源于stack exchange,提问作者Kim
相关产品推荐
相关产品推荐

