首页 > 解决方案 > 如何优化 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.');
}

标签: javascriptarraysalgorithmvalidationbig-o

解决方案


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

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).


推荐阅读