Leetcode 第27题 - 移除元素(easy)
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,1,2,2,3,0,4,2], val = 2,
函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
注意这五个元素可为任意顺序。
你不需要考虑数组中超出新长度后面的元素
解题思路
这里 其实很简单 我们 判断元素 是否为 要删除的元素 ,再使用rust 的remove 就好了,但是这里要注意 如果 我们通过索引取访问 到数组,那么当你remove 完了 后 数组里面 元素数 就少了 一个 下一次循环 就要减1, 那么 我们 每次 remove 后都需要计数 一下,然后 把 index 减去 这个计数 得出来的是 我们 删除后下一个元素的位置。
比如 [3,2,2,3] 我们要删除 2
如果 我们第一次去访问 index = 0 访问到 3
第二次访问 index =1 访问到 2 是目标值 remove
当我们 第三次要访问 的时候 index = 2 但是 由素组被更新过了 变成了 [3,2,3] 访问 2 就直接变成了 3 了 跳过了 2
所以 当我们 定义 一个 计数器 每当 remove 时 count+ 1 , 每次访问的索引变成 index - count 这样 第三次访问变成了 1 这样 就解决了 这个问题.
pub fn remove_element(nums: &mut Vec<i32>, val: i32) -> i32 { let mut count:i32 = 0; for i in 0..nums.len(){ if nums[i - count as usize] == val { nums.remove(i - count as usize); count +=1; } } nums.len() as i32 } fn main() { let mut a1 =vec![3]; let mut a2 =vec![3,2,2,3]; println!("{}",remove_element(a2.as_mut(), 2)); println!("{:?}",a2); }
