LeetCode题目:排除最值的平均薪资计算及代码实现疑问
问题描述
给定一个由唯一整数组成的数组salary,其中salary[i]表示第i位员工的薪资。请返回排除最高和最低薪资后的员工平均薪资。答案与实际值误差在10^-5以内均会被接受。
我的思路与代码
我原本想从let sal = salary[0]开始,把其他薪资和salary[0]比较,把更小的薪资推入新数组,但不知道怎么分离出最低薪资,也不清楚怎么完成整个问题。以下是我的代码:
/** * @param {number[]} salary * @return {number} */ var average = function(salary) { let sal = salary[0] for(let i = 1; i < salary.length; i++){ if (sal > salary[i]) { salary.map() } } };
解决方案
这里有两种简单高效的实现方式:
方法一:遍历一次求总和、最大、最小值
不用排序,一次遍历就能拿到所需数据,时间复杂度O(n),效率更高:
var average = function(salary) { let sum = 0; let min = Infinity; let max = -Infinity; for(let num of salary){ sum += num; // 更新最小值 if(num < min) min = num; // 更新最大值 if(num > max) max = num; } // 总和减去最大和最小值,再除以剩余员工数(原长度减2) return (sum - min - max) / (salary.length - 2); };
方法二:排序后截取计算
先排序数组,去掉首尾的最小和最大值,再计算剩余元素的平均值:
var average = function(salary) { // 按升序排序数组 salary.sort((a, b) => a - b); let sum = 0; // 从索引1遍历到倒数第二个元素(跳过首尾) for(let i = 1; i < salary.length - 1; i++){ sum += salary[i]; } return sum / (salary.length - 2); };
说明
- 题目明确数组元素是唯一整数,所以无需处理重复的最大/最小值;
- 方法一的效率优于方法二,推荐使用;
- 两种方法计算出的结果都能满足误差要求。
内容的提问来源于stack exchange,提问作者joel
相关产品推荐
相关产品推荐

