
在 Rust 中实现这道题我们需要利用 HashMap 来进行频次统计。由于 Rust 的所有权机制和严格的类型检查我们在遍历和更新哈希表时通常会使用 entry API 来优雅地处理键不存在的情况。Rust 代码实现use std::collections::HashMap;impl Solution {pub fn min_swaps(nums: Veci32, forbidden: Veci32) - i32 {let n nums.len() as i32;let mut total_freq: HashMapi32, i32 HashMap::new();// 1. 统计 nums 和 forbidden 中每个数字的总出现次数for i in 0..nums.len() {*total_freq.entry(nums[i]).or_insert(0) 1;*total_freq.entry(forbidden[i]).or_insert(0) 1;}// 2. 鸽巢原理如果某个数字总出现次数超过 n则无解for freq in total_freq.values() {if freq n {return -1;}}// 3. 统计“坏位置”nums[i] forbidden[i]及其对应值的频次let mut bad_freq: HashMapi32, i32 HashMap::new();let mut bad_sum: i32 0; // 坏位置的总数let mut max_bad: i32 0; // 单个坏值出现的最大频次for i in 0..nums.len() {if nums[i] forbidden[i] {let count bad_freq.entry(nums[i]).or_insert(0);*count 1;bad_sum 1;max_bad max_bad.max(*count);}}// 4. 贪心计算最小交换次数// 公式max(ceil(bad_sum / 2), max_bad)// 在 Rust 中(bad_sum 1) / 2 可以安全地实现向上取整((bad_sum 1) / 2).max(max_bad)}}核心语法与逻辑说明1. entry().or_insert(0)这是 Rust 中操作 HashMap 的惯用写法。如果 nums[i] 在 map 中不存在它会插入一个默认值 0 并返回该值的可变引用如果已存在则直接返回已有值的引用。这避免了重复的 contains_key 检查。2. 向上取整Python 中的 (bad_sum 1) // 2 在 Rust 中对应 (bad_sum 1) / 2。因为 bad_sum 是整数Rust 的整数除法默认向下取整加 1 后再除 2 完美实现了 ceil(bad_sum / 2) 的效果。3. .max() 方法Rust 标准库为整数类型提供了 .max(other) 方法可以直接取两者中的最大值代码比 Python 的 max(a, b) 更加面向对象。复杂度分析* 时间复杂度O(n)其中 n 是数组长度。我们仅对数组进行了常数次线性遍历且 HashMap 的插入和查询平均时间复杂度为 O(1)。* 空间复杂度O(n)主要用于存储 total_freq 和 bad_freq 两个哈希表在最坏情况下需要存储 2n 个键值对。需要我帮你写几组测试用例来验证一下 Rust 实现的正确性吗