leetcode
leetcode 1351 ~ 1400
去掉最低工资和最高工资后的工资平均值

去掉最低工资和最高工资后的工资平均值

难度:

标签:

题目描述

代码结果

运行时间: 18 ms, 内存: 15.9 MB


/*
 * 思路:
 * 1. 使用Java Stream API来处理工资数组。
 * 2. 找到最低工资和最高工资。
 * 3. 计算所有工资的总和。
 * 4. 从总和中减去最低工资和最高工资。
 * 5. 剩下工资的总和除以剩下的员工数量,得到平均工资。
 */

import java.util.Arrays;

public class Solution {
    public double average(int[] salary) {
        int minSalary = Arrays.stream(salary).min().getAsInt();
        int maxSalary = Arrays.stream(salary).max().getAsInt();
        int sum = Arrays.stream(salary).sum();
        sum -= (minSalary + maxSalary);
        return sum / (double) (salary.length - 2);
    }
}

解释

方法:

此题解的思路是首先计算数组中所有工资的总和。然后,通过内置的max和min函数找到最高工资和最低工资,并从总和中减去这两个值。得到的结果再除以工资数组长度减去2(因为去掉了两个工资),即得到剩余工资的平均值。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
在计算总工资时,为什么选择遍历整个数组,而不是在一次遍历中同时计算总和、最大值和最小值?
在题解中选择遍历整个数组来单独计算总和,然后再使用max和min函数分别找到最大和最小值,这种方法更为直观且易于实现。但实际上,这并不是最高效的方法,因为它涉及到多次数组遍历。一次遍历同时计算总和、最大值和最小值是更优的做法,可以减少时间复杂度和提升性能。
🦆
如果数组 `salary` 只包含两个元素,代码中的处理逻辑会如何应对?
如果数组 `salary` 只包含两个元素,按照题目要求去掉最高工资和最低工资后,数组将没有剩余元素。在这种情况下,`n` 将为0(`len(salary) - 2`)。尝试进行除以0的操作将引发运行时错误。代码需要增加一个检查,以确保 `n` 大于0,避免除零错误。
🦆
你的方法中使用了多次遍历(一次完整遍历求和,一次查找最大值和最小值),是否可以通过一次遍历完成所有操作以优化性能?
是的,可以通过一次遍历同时计算总和、找到最大值和最小值来优化性能。在一次遍历中维护三个变量:总和、当前最大值和当前最小值,可以有效地减少遍历次数,从而提高代码的效率。这种方法将整个处理的时间复杂度从O(2n)降低到O(n)。
🦆
在函数返回结果时,直接使用了 `float` 类型转换,这是否是必要的,考虑到 Python 中的除法 `/` 默认结果就是浮点数?
在Python中,使用 `/` 运算符进行除法默认结果是浮点数,所以这里使用 `float` 类型转换实际上是多余的。无论输入的数据类型是什么(整数或浮点数),`/` 运算符都将输出浮点数,因此可以省略显式的 `float` 转换,简化代码。

相关问题