【问题标题】:Why does my function return an incorrect answer for the average salary question为什么我的函数对平均工资问题返回不正确的答案
【发布时间】:2020-07-17 18:29:31
【问题描述】:

我对 javascript 很陌生,并且正在解决 leetcode 中的问题。

包含的描述是: "给定一个唯一整数salary 数组,其中salary[i] 是雇员i 的薪水。

返回员工的平均工资,不包括最低和最高工资。"

当我运行我的代码时,它说当传入以下数组时我的输出不正确。

[25000,48000,57000,86000,33000,10000,42000,3000,54000,29000,79000,40000]
Expected Output: 41700.00000
My Output: 41000.00000

我已将我的代码与其他提交的代码进行了比较,据我所知,我的代码应该运行相同。 这是我的代码:

function average(salary) {
  var sortedSalary = salary.sort();
  var total = sortedSalary.reduce((curr, acc) => {
    return curr + acc
  }, 0);
  var result = (total - sortedSalary[0] - sortedSalary[sortedSalary.length - 1]) / (sortedSalary.length - 2);
  return result;
};
console.log(average([25000,48000,57000,86000,33000,10000,42000,3000,54000,29000,79000,40000]));

感谢您对此的任何见解。

【问题讨论】:

    标签: javascript average


    【解决方案1】:

    您正在对数组 alphabetically 进行排序,而不是按最小的数字,因此您最终会删除错误的数字。

    改用sort((a, b) => a - b)

    const salary = [25000,48000,57000,86000,33000,10000,42000,3000,54000,29000,79000,40000]
    
    function average(salary) {
      var sortedSalary = salary.sort((a, b) => a - b);
      var total = sortedSalary.reduce((curr, acc) => { return curr + acc }, 0);
      var result = (total - sortedSalary[0] - sortedSalary[sortedSalary.length - 1]) / (sortedSalary.length - 2);
      return result;
    };
    
    console.log(average(salary))

    【讨论】:

    • 请注意,通过基本调试可以很容易地发现问题console.log(sortedSalary) 会暴露这个问题。
    • 换句话说,[300, 10, 2].sort() 产生[10, 2, 300]
    • 啊,当然可以。我仍然了解所有本机功能的工作原理,并完全忘记了这一点。我使用了调试器,但完全错过了整个事情。谢谢大家的回答和提醒,要放慢速度,真正看看发生了什么。
    【解决方案2】:

    const average = salary => salary
      .sort((a,b) => a - b) // sort numerically
      .filter((_,i,l) => i > 0 && i < l.length - 1) // remove first and last index
      .reduce((a,s) => a + s) / (salary.length - 2) // calculate average
    
    console.log(average([25000,48000,57000,86000,33000,10000,42000,3000,54000,29000,79000,40000]))

    【讨论】:

      【解决方案3】:

      根本不需要排序。除此之外,这里的排序O(N Log N) 效率不够高。你只需要想出一个O(N) 算法来解决这个问题。

      这会过去的:

      var average = function(salary) {
          if (salary.length < 3) {
              return 0
          }
      
          let min = salary[0]
          let max = salary[0]
          let sum = 0
      
          for (let sal of salary) {
              if (sal > max) {
                  max = sal
              }
      
              if (sal < min) {
                  min = sal
              }
      
              sum += sal
          }
      
          return (sum - max - min) / (salary.length - 2)
      };
      

      参考文献

      • 有关其他详细信息,您可以查看Discussion Board。有很多公认的解决方案,其中包含各种languages 和解释、高效算法以及渐近的time/space 复杂性分析1, 2

      对于interviews

      • 我们希望根据标准和约定编写bug-freeclean 代码(例如,12@ 987654334@, 2, 1, 2, 1, 2, 1111支持>)。

      • 对于easy 的问题,蛮力算法通常会被接受。对于面试,蛮力不太需要,特别是如果问题是easy 级别,就像您正在解决的问题一样。

      【讨论】:

        猜你喜欢
        • 2020-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-26
        • 1970-01-01
        • 2014-05-22
        相关资源
        最近更新 更多