需求描述
给定一组数字,需要使用 vector 数据结构,用 Rust 语言实现计算列表的中位数和众数。
前置技能
Rust 语言的基本语法;
vector 数据结构的使用;
哈希 map(HashMap)的使用。
解决方案
首先,我们需要对给定的数字进行排序,以方便计算。在 Rust 语言中,可以使用 sort_unstable() 方法对 vector 中的元素进行排序。
接下来,对于计算中位数的问题,我们可以先判断数组长度是奇数还是偶数。若是偶数,则取中间两位数的平均数;若是奇数,则直接取中间那个数。需要注意,在 Rust 语言中,整数相除若不能整除,则会舍去尾数,因此需要将中间两位数转换为 f64 类型来防止整数去尾。
对于计算众数的问题,我们需要使用哈希 **map(HashMap)**来记录每个元素出现的次数。遍历整个 vector 数组,将元素作为哈希 map 的键,若 map 中不存在该键,则将其添加进 map 中,并赋值为 0;若存在该键,则将其值加一。
最后,使用 into_iter() 方法将哈希 map 转换为迭代器,使用 max_by_key() 方法查找出现次数最多的元素,并使用 map() 方法获取该元素的值,最后返回此值即为众数。
实现代码
上面是这篇博客的核心步骤,接下来附上完整的 Rust 代码:
use std::collections::HashMap;
fn main() {
// 数据集合
let mut num_arrs = vec![11, 2, 4, 5, 34, 2, 7, 7, 5, 45, 12, 23, 34];
// 从小到大排序
num_arrs.sort_unstable();
let median = median(&num_arrs);
let mode = mode(&num_arrs);
println!("中位数为:{:?}", median);
println!("众数为:{}", mode);
}
fn median(num_arrs: &Vec<i32>) -> f64 {
// 在rust中 整数若不能整除,则会舍去尾数
// 例如:5/2 = 2
let middle = num_arrs.len() / 2;
// 判断数组是单数还是双数
if num_arrs.len() % 2 == 0 {
// 双数则获取中间两位数并将其转为 f64 防止整数去尾
(num_arrs[middle - 1] + num_arrs[middle]) as f64 / 2.0
} else {
// 若为单数则直接返回数据
num_arrs[middle] as f64
}
}
fn mode(num_arrs: &Vec<i32>) -> i32 {
let mut freq_map = HashMap::new();
for &num in num_arrs {
// entry 用于查找是否存在对应的键值对
// or_insert 若不存在 则进行创建,并添加值为0
*freq_map.entry(num).or_insert(0) += 1;
}
let mode = freq_map
.into_iter() // 将freq_map转换为迭代器
.max_by_key(|&(_, count)| count) // 查找出现次数最多的元素
.map(|(val, _)| val) //获取该元素的值
.unwrap(); //若出现多个出现次数相同的元素,则随机返回其中一个元素
mode
}
希望这篇博客可以对您有所帮助,如果有任何疑问或建议,请随时留言交流。谢谢!
最后
玩到极致,便是艺术。
加油。