Leetcode Rust 27删除元素

ldioqlga  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(106)

这是我的解决方案。也许它看起来有点复杂和不必要。我通过了105/111测试,所以我想找到我的代码中的bug在哪里。在这里你可以直接到Leetcode页面。Remove Element

pub fn remove_element(nums: &mut Vec<i32>, val: i32) -> i32 {
        let mut temp = Vec::new();
        let len = nums.len();
        for (i, v) in nums.iter().enumerate() {
            if *v == val {
                temp.push(i)
            }
        }
        let new_len = temp.len();
        temp.iter()
            .skip_while(|x| (len - new_len..len).contains(x))
            .zip((len - new_len..len).skip_while(|x| temp.contains(x)))
            .map(|(a, b)| {
                nums[*a] = nums[b];
            })
            .collect::<()>();
        (len - new_len) as i32
    }

我的想法是创建一个vec temp,它存储与要删除的val相等的元素的索引。
然后我使用函数式编程。简单的想法是将nums的末尾设置为交换区域,长度为temp.len()。然后我将所有不等于value的值与存储在temp中的索引交换到前面(毫无疑问,我们需要省略交换区域中已经存在的索引)
下面是错误测试用例:

# Testcase:
[4,2,0,2,2,1,4,4,1,4,3,2]

# Answer:
[3,2,0,2,2,1,4,1]

# Expected:
[2,2,0,2,2,1,3,1]

也许你应该自己在leetcode中测试这段代码。非常感谢!

osh3o9ms

osh3o9ms1#

我发现我应该使用filter而不是skip_while,这就是问题所在。

pub fn remove_element(nums: &mut Vec<i32>, val: i32) -> i32 {
        let mut temp = Vec::new();
        let len = nums.len();
        for (i, v) in nums.iter().enumerate() {
            if *v == val {
                temp.push(i)
            }
        }
        let new_len = temp.len();
        temp.sort_by(|a, b| b.cmp(a));
        temp.iter()
            .skip_while(|x| (len - new_len..len).contains(x))
            .zip((len - new_len..len).filter(|x| !temp.contains(x)))
            .for_each(|(a, b)| {
                println!("{a} : {b}");
                nums[*a] = nums[b]
            });
        (len - new_len) as i32
    }

相关问题