我试图解决任务(除了最高和最低元素(值,而不是索引!)之外,总结所有数组的数字(在F#和Haskell中你得到一个列表)。 (最高/最低元素在每个边缘分别只有一个元素,即使有多个元素具有相同的值!)
这是我的代码,但我收到了NaN
function sumArray(array) {
var sum;
array.sort(function(a, b) {
return a - b
});
for (var i = 1; i < array.length - 2; i++) {
return sum += array[i];
}
}
console.log(
sumArray([6, 2, 1, 8, 10])
)
&#13;
答案 0 :(得分:1)
一些问题:
sum
需要一个初始值,即0 return
在循环中,所以循环只能进行一次迭代,......永远。在循环之后移动它i < array.length - 1
sort
,这使得它的复杂时间为 O(nlogn)。如果您使用Math.min
和Math.max
,则可以在 O(n)中执行此操作:
function sumArray(array) {
return array.length < 2 ? 0
: array.reduce((a, b) => a + b) - Math.min(...array) - Math.max(...array);
}
console.log(
sumArray([6, 2, 1, 8, 10])
)
注意:这是所有主流浏览器都支持的ES6代码,IE是一个值得注意的例外。
对于旧版浏览器:
function sumArray(array) {
return array.length < 2 ? 0
: array.reduce(function (a, b) {
return a + b;
}) - Math.min.apply(null, array) - Math.max.apply(null, array);
}
console.log(
sumArray([])
)
对于非常大的数组,可能需要通过reduce
获取最小值和最大值,因为可以传递给函数调用的参数数量是有限的。
答案 1 :(得分:0)
<length-1
,而不是2 注意在第二个例子中,我使用reduce来获得max和min,因为
如果数组元素太多,则spread(...)和apply将失败或返回错误的结果,因为它们尝试将数组元素作为函数参数传递。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
function sumArray(array) {
var sum = 0;
array.sort(function(a, b) {
return a - b
});
for (var i = 1; i < array.length - 1; i++) {
sum += array[i];
}
return sum;
}
console.log(
sumArray([6, 2, 1, 8, 10])
)
// or not sorting
let arr = [6, 2, 1, 8, 10];
const max = arr.reduce(function(a, b) {
return Math.max(a, b);
})
const min = arr.reduce(function(a, b) {
return Math.min(a, b);
})
let sum = arr.reduce(function(a, b) {
return a + b;
}, 0); // add
sum -= (min + max);
console.log(sum)
// using one reduce (https://stackoverflow.com/a/43576388/295783):
let minmax = arr.reduce(
(accumulator, currentValue) => {
return [
Math.min(currentValue, accumulator[0]),
Math.max(currentValue, accumulator[1])
];
}, [Number.MAX_VALUE, Number.MIN_VALUE]
)
sum = arr.reduce(function(a, b) {
return a + b;
}, 0); // add
sum -= (minmax[0] + minmax[1]);
console.log(sum)
&#13;