JavaScript计算数组4个最高值、4个最低值之和的问题求解
问题根因
slice() 方法传入负整数参数时,逻辑是从数组尾部倒数定位截取起点,你写的 sorted.slice(-1) 等价于截取数组倒数第1个元素到末尾,所以只能拿到最后一个最大值,自然无法得到前4个最小值元素。
原有逻辑修复
对于长度固定为5的升序排序数组,两个求和的截取规则应该是:
- 4个最高值求和:剔除索引为0的最小元素,保留索引1到末尾的4个元素,你原来写的
sorted.slice(1)逻辑是正确的 - 4个最低值求和:剔除索引为4的最大元素,保留索引0到索引3的前4个元素,对应写法是
sorted.slice(0, 4)
修复后可正常运行的基础版代码:
var arr = [3, 1, 5, 7, 9]; function miniMaxSum(arr) { // 注意:求和变量必须定义在函数内部,避免全局污染导致多次调用结果累加错误 var totalMaxSum = 0; var totalMinSum = 0; var sorted = arr.sort(function(a, b){return a - b}); var maxArr = sorted.slice(1); var minArr = sorted.slice(0, 4); for(var count = 0; count < maxArr.length; count++) { totalMaxSum += maxArr[count]; } for(var count = 0; count < minArr.length; count++) { totalMinSum += minArr[count]; } console.log("4个最小值求和:" + totalMinSum); console.log("4个最大值求和:" + totalMaxSum); } miniMaxSum(arr);
更简洁的实现方案
不需要手写for循环做累加,直接用数组内置的reduce方法即可完成求和,同时可以先拷贝数组再排序,避免sort方法修改原数组:
function miniMaxSum(arr) { // 浅拷贝后排序,不修改原数组 const sorted = [...arr].sort((a, b) => a - b); // 通用求和逻辑 const calcSum = list => list.reduce((acc, cur) => acc + cur, 0); const minSum = calcSum(sorted.slice(0, 4)); const maxSum = calcSum(sorted.slice(1)); console.log(minSum, maxSum); return [minSum, maxSum]; } // 测试用例 miniMaxSum([3,1,5,7,9]); // 输出 16 24,和预期结果一致
内容的提问来源于stack exchange,提问作者mustyg123
相关产品推荐
相关产品推荐

