题目

编程语言
rust
注意点
原地置换法:原地置换的总体思路就是将我们的元素放到他的索引位置。我们可以这样理解,每个人都有自己的位置,我们需要和别人调换回到属于自己的位置,调换之后,如果发现我们的位置上有人了,则返回。算法来源

代码
pub fn find_duplicate(nums: Vec<i32>) -> i32 {
let mut nums2 = nums.clone();
for i in 0..nums2.len() {
while nums2[i] != i as i32 {
if nums2[i] == nums2[nums2[i] as usize] {
return nums2[i];
}
let temp = nums2[i] as usize;
nums2[i] = nums2[temp];
nums2[temp] = temp as i32;
}
}
return -1;
}
测试
#[cfg(test)]
mod tests{
use super::*;
#[test]
fn test_1(){
assert_eq!(find_duplicate(vec![1,3,4,2,2]),2);
}
#[test]
fn test_2(){
assert_eq!(find_duplicate(vec![3,1,3,4,2]),3);
}
#[test]
fn test_3(){
assert_eq!(find_duplicate(vec![1,1]),1);
}
#[test]
fn test_4(){
assert_eq!(find_duplicate(vec![1,1,2]),1);
}
}