javascript - 如何优化 find_average_number(array) 简单函数?
问题描述
我解决了 CodeWars 挑战:`编写函数 find_average,它计算给定数组中数字的平均值。但问题是:
1)如何用 Big-O 表示法优化此代码,是否可以减少循环迭代:使用 array.every 测试输入值(当 array.reduce 使用 [1, 2, 'string'] 时需要排除 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)
.
推荐阅读
- ios - 向上滑动(将应用程序置于后台)并且视频正在自定义 AVPLayer 中播放时,如何停止画中画?
- python - 单击按钮时如何只创建一个新窗口?tkinter
- reactjs - 呈现非 React 组件的组件上的命令式逻辑(大部分)
- git - 子树存储库和主存储库都包含相同的文件。这是正常的 git 行为吗?
- html - Bootstrap 使用另一列的空间
- python - Matplotlib 集合未清除
- python - 将连续变量下采样到均匀分布
- typescript - 是否可以创建一个导出 mixins 的 Typescript 模块?
- discord.py - How could I ping @here in Discord.py?
- postgresql - 加速一个简单的 postgres 查询