马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 hrp 于 2021-3-21 12:22 编辑
初学摸索阶段,暴力求解
// ### 练习:
// 给定一系列数字,使用 vector
// 并打印这个列表的平均数(mean, average)、
// 中位数(排列数组后位于中间的值)和
// 众数(mode,出现次数最多的值;这里哈希函数会很有帮助)。
use std::collections::HashMap;
fn main() {
let mut shuzi = vec![131, 36, 5, 5, 6, 4514, 6, 351];
let (average, mid_num, mode_list) = solution(&mut shuzi);
println!(
"列表:{:?}\n中位数:{}\n众数:{:?}\n平均数:{}",
&shuzi, &mid_num, &mode_list, &average,
);
}
fn solution(list: &mut Vec<i32>) -> (f64, i32, Vec<i32>) {
// 排序
list.sort();
// 列表长度
let length = list.len();
// 中位数
let mid_num = list[length / 2];
// 求列表数和
let sum: i32 = list.iter().sum();
// 求平均数
let average: f64 = sum as f64 / length as f64;
// 新建空哈希表用于储存列表中每个数字出现次数
let mut mode_m: HashMap<i32, u32> = HashMap::new();
// 新建可变变量max_count储存任意数字出现的最大次数
let mut max_count = 0;
// 新建一个储存众数的空列表
let mut mode_list: Vec<i32> = Vec::new();
// 遍历列表,计算数字出现次数
for i in list.clone() {
let count = mode_m.entry(i).or_insert(0);
*count += 1;
// 如果count大于等于max_count
if *count > max_count {
// 最大出现次数max_count更新为count
max_count = *count;
}
}
// 遍历list
for value in list {
// 当前数字出现次数count
let count = mode_m.get(value).unwrap();
// 如果当前数字出现次数等于max_count且mode_list中没有value
if (*count == max_count) && !mode_list.contains(value) {
// 则将该数字value加入众数列表mode_list
mode_list.push(*value);
}
}
// 返回结果,也可以写成 return (average, mid_num, mode_list);
(average, mid_num, mode_list)
}
|