c++ - 返回数组中的剩余平均值
问题描述
给定一个整数数组 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;
}
有任何想法吗?
解决方案
在这条线上:
double average = sum / (largest - smallest);
右侧仅由int
s 组成,因此您正在进行整数除法,然后将其分配给 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);
}
推荐阅读
- javascript - 我们无法注册默认服务工作者
- vb.net - 绑定到数据表后,组合框不显示 SelectedValue
- vue.js - 有没有办法在vue中获取router.back的url?
- html - Google 的 data-nosnippet 是否打破了“data-”属性前缀的约定?它是第一个这样做的吗?
- c# - 需要有关 Unity2D Android 的 C# 脚本的帮助或建议,关于广告。Unity 建议我的代码已过时
- python - 强制 Dlib python 仅在 CPU 支持下安装;在带有 Cuda 和一切的 GPU 机器上
- wpf - WPF Listview 可以在布局中嵌入不同高度的元素吗?
- php - 邮件未到达特定收件人
- javascript - Javascript对象循环搜索数据
- sass - SCSS 文件观察器无法打开文件 - WebStorm