首页 > 解决方案 > 返回数组中的剩余平均值

问题描述

给定一个整数数组 arr,在删除最小的 5% 和最大的 5% 元素后返回剩余整数的平均值。

我已经尝试过这个问题,我相信我是对的,但是它没有输出我希望的结果。

例子:

Input: arr = [6,2,7,5,1,2,0,3,10,2,5,0,5,5,0,8,7,6,8,0]
Output: 4.00000

我的代码:

double trimMean(vector<int> &arr)
{
    sort(arr.begin(), arr.end());
    int length = arr.size();
    int smallest = round(0.05 * length);
    int largest = round(0.95 * length);
    int sum = 0;
    for (int i = smallest; i <= largest; i++)
    {
        sum += arr[i];
    }
    double average = sum / (largest - smallest);
    return average;
}

有任何想法吗?

标签: c++algorithmsorting

解决方案


在这条线上:

double average = sum / (largest - smallest);

右侧仅由ints 组成,因此您正在进行整数除法,然后将其分配给 a double

sum您可以通过以下方式解决此问题double

double sum = 0;

此外,对于这个问题,对整个范围进行排序是不必要的低效。您只关心忽略第一个和最后 5% 的元素。为此,您可以使用一些算法来编写:

double trimMean(vector<int> &arr)
{
    int length = arr.size();
    int five_pc = round(0.05 * length);
    
    // smallest 5%, and largest 95% in the correct relative positions
    std::nth_element(arr.begin(), 
                     arr.begin() + five_pc, 
                     arr.end());

    // largest 5% in the correct relative positions, 
    // while maintaining smallest 5%
    std::nth_element(arr.begin() + five_pc, 
                     arr.end() - five_pc, 
                     arr.end());

    return std::accumulate(arr.begin() + five_pc, 
                           arr.end() - five_pc, 
                           0.0) / (arr.size() - 2 * five_pc);
}

推荐阅读