这是我参与更文挑战的第14天,活动详情查看: 更文挑战
1491. 去掉最低工资和最高工资后的工资平均值
题目描述
给你一个整数数组 salary ,数组里每个数都是唯一的,其中 salary[i] 是第 i 个员工的工资。
请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。
示例 1:
输入:salary = [4000,3000,1000,2000]
输出:2500.00000
解释:最低工资和最高工资分别是 1000 和 4000 。
去掉最低工资和最高工资以后的平均工资是 (2000+3000)/2= 2500
示例 2:
输入:salary = [1000,2000,3000]
输出:2000.00000
解释:最低工资和最高工资分别是 1000 和 3000 。
去掉最低工资和最高工资以后的平均工资是 (2000)/1= 2000
示例 3:
输入:salary = [6000,5000,4000,3000,2000,1000]
输出:3500.00000
示例 4:
输入:salary = [8000,9000,2000,3000,6000,1000]
输出:4750.00000
提示:
- 3 <= salary.length <= 100
- 10^3 <= salary[i] <= 10^6
- salary[i] 是唯一的。
- 与真实值误差在 10^-5 以内的结果都将视为正确答案。
友情链接
思路解析
非常简单的一道题,顺序遍历这个数组,O(n) 的时间复杂度,分别用两个变量 max,min 存储最大值和最小值。在遍历过程中,就直接依次比较两个数的大小就能够筛选出 max 和 min 。
对数组中每个元素的总和,在去掉最大值和最小值之后,求平均值,即为最终答案。
算法实现
class Solution {
public double average(int[] salary) {
double d=salary[0],max=salary[0],min=salary[0];
for(int i=1;i<salary.length;i++){
d+=salary[i];
max=Math.max(max,salary[i]);
min=Math.min(min,salary[i]);
}
return (d-max-min)/(salary.length-2);
}
}
复制代码
运行结果
花样设计
用了 Arrays 里封装的方法,但是性能很差。可以对比一下。
class Solution {
public double average(int[] salary) {
return Arrays.stream(salary).sorted().skip(1).limit(salary.length-2)
.mapToDouble(i->(double)i)
.average()
.getAsDouble();
}
}
复制代码