kylin来刷题啦-Day08:1491. 去掉最低工资和最高工资后的工资平均值

·  阅读 296

这是我参与更文挑战的第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 以内的结果都将视为正确答案。

友情链接

leetcode-cn.com/problems/av…

思路解析

非常简单的一道题,顺序遍历这个数组,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);
    }
}
复制代码

运行结果

image.png

花样设计

用了 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();
    }
}
复制代码

image.png

分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改