删除某些元素后的数组均值
难度:
标签:
题目描述
代码结果
运行时间: 27 ms, 内存: 16.1 MB
/*
* 思路:
* 1. 使用 Stream API 将数组转换为流并排序。
* 2. 计算要删除的元素数量,即数组长度的5%。
* 3. 删除最小和最大的元素,即删除排序后数组的前5%和后5%的元素。
* 4. 计算剩余元素的平均值。
*/
import java.util.Arrays;
import java.util.stream.IntStream;
public class Solution {
public double trimMean(int[] arr) {
int n = arr.length;
int removeCount = n / 20; // 5% 的元素数量
return IntStream.of(arr)
.sorted()
.skip(removeCount)
.limit(n - 2 * removeCount)
.average()
.orElse(0.0);
}
}
解释
方法:
题解使用了Python的排序和切片功能来简化操作。首先,将数组排序,以确保可以方便地去除最小和最大的5%的元素。因为数组长度是20的倍数,所以可以通过整除20来直接得到5%元素的数量(记为n)。通过切片操作[arr[n:-n]],去除数组中的前n个(最小的)和后n个(最大的)元素。随后,使用sum函数计算剩余元素的总和,再除以剩余元素的数量(原数组长度的90%,即len(arr) - 2*n)来得到所需的平均值。
时间复杂度:
O(n log n)
空间复杂度:
O(n)
代码细节讲解
🦆
在确定删除最小5%和最大5%的元素时,如何处理数组长度不是20的倍数的情况?
▷🦆
排序后直接通过切片删除元素是否会影响原数组的结构,对此有什么具体的考虑么?
▷🦆
如果数组中存在多个相同的最小值或最大值,这种方法是否仍然准确地删除正确的元素数量?
▷🦆
为什么在计算平均值时使用 len(arr) - 2 * n 而不是直接使用剩余元素的数量?
▷