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);
}

image-20200629231857041