leetcode打卡-0027移除元素

题目描述

给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/remove-element

解题思路

1. 双指针

这题和leetcode第26题几乎一样的思路,已经在这里记录过题解。

用一个慢指针slow指向有效数组的最后一个位置,用来记录符合条件的数组尾部,用一个快指针fast顺序遍历数组。

当fast指针所指的值与val不一致时,将slow后一位的值改为fast指向的值,slow前进一位,fast继续遍历即可。

# Python实现

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        # 双指针法:同删除相同元素方法一样
        j = 0
        for i in range(len(nums)):
            if nums[i] != val:
                nums[j] = nums[i]
                j += 1
        return j

顺便练习一下Rust

impl Solution {
    pub fn remove_element(nums: &mut Vec<i32>, val: i32) -> i32 {
        if nums.is_empty() {
            return 0;
        }

        let mut i = 0;
        for j in 0..nums.len() {
            if nums[j] != val {
                nums[i] = nums[j];
                i += 1;
            }
        }
        i as i32
    }
}

总结

对于这种字符串、数组之类的可以直接遍历的题目,利用具体要求提炼出“保留逻辑”,将这种逻辑应用到遍历中的每一个位置即可。