如何优化find_average_number(数组)简单功能?



我解决了CodeWars的挑战:"编写函数find_average,它计算给定数组中数字的平均值。但问题是:

1(如何用Big-O表示法术语优化此代码,是否可以减少循环迭代:使用array.each测试输入值(当array.reduce使用[1,2,"字符串"]时需要排除TypeError(

2(我认为现在复杂度等于Θ(n(,对吗?

function find_average(array) {
// your code here
if (Array.isArray(array) && array.every(elem => typeof elem == 'number')) {
const numberCount = array.length;
if (numberCount == 1) {
return array[0];
}
let sum = array.reduce((accumulator, currentValue) => {
return accumulator + currentValue;
})
const averageNumber = sum/numberCount;
return averageNumber;
}
throw new TypeError('Array value are not number.');
}

不需要迭代两次,一次检查每个元素是否都是数字,一次将它们全部相加。相反,你可以只迭代一次,如果任何元素不是数字,请立即抛出:

function find_average(array) {
if (!Array.isArray(array)) {
throw new TypeError('Array value are not number.');
}
const sum = array.reduce((a, b) => {
if (typeof b !== 'number') {
throw new TypeError('Array value are not number.');
}
return a + b;
}, 0);
return sum / array.length;
}

function find_average(array) {
if (!Array.isArray(array)) {
throw new TypeError('Array value are not number.');
}
const sum = array.reduce((a, b) => {
if (typeof b !== 'number') {
throw new TypeError('Array value are not number.');
}
return a + b;
}, 0);
return sum / array.length;
}
console.log(find_average([1, 2, 3]));
console.log(find_average([1, 'foo', 3]));

这和您的原始实现都具有O(n)的整体复杂性。

你可以进行一个循环,并检查你是否提前得到了一个数组。

这不仅是一种O(n(方法,而且比使用数组方法进行迭代更快。

function find_average(array) {
// your code here
var sum = 0,
count = 0,
i;

if (!Array.isArray(array) || !array.length) return; // or throw error
for (i = 0; i < array.length; i++) {
if (typeof array[i] !== 'number') continue;
sum += array[i];
count++;
}
if (count === 0) return; // or throw error
return sum / count;
}
console.log(find_average([null, 3, 5, '10', undefined]));
console.log(find_average());
console.log(find_average([]));

最新更新