leetcode 287 rust

题目

编程语言

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);
    }
}
原文地址:https://www.cnblogs.com/GeniusOfCX/p/14631732.html