英文:
Leetcode Rust 27 Remove Element
问题
以下是翻译好的内容:
这是我的解决方案。也许看起来有点复杂和不必要。我通过了105/111个测试,所以我想找出我的代码中的错误在哪里。
你可以在这里访问Leetcode页面。移除元素
我的想法是创建一个名为temp
的向量,其中存储与val
相等的元素的索引,这些元素将被删除。
然后我使用函数式编程。简要思想是将nums的末尾设置为与temp.len()
相等的交换区域的长度。然后,我将所有与value
不相等的值交换到前面,索引存储在temp
中(毫无疑问,我们需要忽略已在交换区域中的索引)。
以下是错误的测试用例:
# 测试用例:
[4,2,0,2,2,1,4,4,1,4,3,2]
# 答案:
[3,2,0,2,2,1,4,1]
# 期望结果:
[2,2,0,2,2,1,3,1]
也许你应该自己在Leetcode中测试这段代码。非常感谢!
英文:
Here's my solution. Maybe it looks a little complicated and unnecessary. I passed 105/111 tests, so I wanted to find where the bug is in my code.
Here you can direct to the Leetcode page. 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
}
My idea is to create a vec temp
which stores the indexs of the elements that equal to the val
, which is to be deleted.
Then I use functional programming. The brief idea is to set the end of the nums as swap area with length of the temp.len()
. Then I swap all the values that don't equal to the value
to the front with the indexs stored in temp
(undoubtedly we need to omit the indexs that is already in the swap area)
Here is the error testcase:
# 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]
Maybe you should test this code in the leetcode yourself. Thanks a lot!
答案1
得分: 0
I found that I should use filter
instead of skip_while
, that's where the problem is.
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()
.filter(|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
}
英文:
I found that I should use filter
instead of skip_while
, that's where the problem is.
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
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论