这是我的解决方案。也许它看起来有点复杂和不必要。我通过了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中测试这段代码。非常感谢!
1条答案
按热度按时间osh3o9ms1#
我发现我应该使用
filter
而不是skip_while
,这就是问题所在。