给你一个整数数组 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
103 <= salary[i] <= 106
salary[i] 是唯一的。
与真实值误差在 10^-5
以内的结果都将视为正确答案。
关键点:
- 计算精度在
10 ^ -5
之内 - 边界判定
实现思路:
- 定义2个变量,int就够用,用来保存最大值和最小值。
- 保证计算精度,使用BigDecimal,但是刚开始 leetcode 说找不到变量,于是我手动在 编辑界面增加了导包语句,成功使用,说明 leetcode 是需要手动导包,也是可以导包的。
代码实现:
/**
* 1491. 去掉最低工资和最高工资后的平均值
* 关键点:
* 1: 【3 <= salary.length <= 100】 -》 数组长度
* 2:【10^3 <= salary[i] <= 10^6】 元素大小
* 3: 元素唯一
* 4:误差值小于 【10 ^ -5】
* 思路:
* 一个存最大值,一个存最小值
*
* @param salary
* @return
*/
public static double average(int[] salary) {
int max = 0;
int min = 0;
double result = 0.0;
long sum = 0;
for (int i = 0; i < salary.length; i++) {
// 初始化
if (i == 0) {
max = Math.max(salary[0], salary[1]);
min = Math.min(salary[0], salary[1]);
i = 1;
continue;
}
if (salary[i] > max) {
max = salary[i];
}
if (salary[i] < min) {
min = salary[i];
}
}
// 循环结束之后 创建一个新的数组,去除最大值和最小值 然后计算平均值
for (int i : salary) {
if (i == max || i == min) {
continue;
}
sum += i;
}
BigDecimal sumD = new BigDecimal(sum);
BigDecimal resultD = sumD.divide(new BigDecimal(salary.length - 2), 5, RoundingMode.HALF_UP);
result = resultD.doubleValue();
System.out.println(result);
return result;
}
运行结果:
- 说实话这个运行时间 3ms 只击败了 5% 我没看懂为啥
- 37.5 MB 击败了 100% 也没看懂,我猜测可能速度快的解法使用了多个数组? 我本来也想再创建一个新数组,但是还是使用了遍历的方法。
其他人的优秀解法:
看到了第一个解法我就觉得我是sb,思路太简单粗暴还效率高了。
- 对数组进行排序。
- 遍历数组,去掉第一个和最后一个(最小值和最大值),求和
sum / (num.length -2)
public double average(int[] salary) {
double ans=0;
int len=salary.length;
Arrays.sort(salary);
for(int i=1;i<len-1;i++){
ans+=salary[i];
}
return ans/(len-2);
}
自愧不如,Arrays.sort 真是个好api
。
Q.E.D.
Comments | 0 条评论