【leecode】第27题:移除元素

题目:

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

题目链接:移除元素


题目限制:

不要使用额外的数组空间,仅使用O(1)额外空间并原地修改数组

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


解题思路:

因为题目只要求移除和val相同的元素,所以不需要考虑数组是否排序问题

本题解法较多,可同样使用双指针方法记录 !=val 的元素(详见文末的第26题解答笔记链接)

也可以通过将 ==val 的元素移除出去,这里涉及python内置函数的remove()、pop()、del()方法的区别

特殊情况:数组个数为0时,返回0


实现代码:

利用两个指针实现记录不等于val值的元素,fast指针用于遍历nums的所有元素,slow负责记录每个fast!=val的元素,最后返回slow记录的全部元素

# 双指针解法
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        fast = slow = 0                     # 从第1个元素开始,既nums[0]
        while fast < len(nums):             # 设置循环条件,fast的遍历次数等于nums数组的长度
            if nums[fast] != val:           # 当数组nums的第fast个元素 不等于 val 值时
                nums[slow] = nums[fast]     # slow指针记录nums中当前fast的元素,既记录不等于val的元素
                slow += 1                   # 下一个slow
            fast += 1                       # fast遍历下一个元素
        return  slow                        # 返回所有slow = fast 的元素,既返回所有不等于 val 值的元素

count()函数用于统计nums 中,有多少个等于 val 值的元素

再移除nums中等于 val 值的第一个元素,循环count次

# count + remove  + for循环 解法
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        c = nums.count(val)             # 统计 val 在nums中的次数
        for i in range(c):              # val 在nums 中有多少次就循环多少次
            nums.remove(val)            # 每循环一次,就删除一次 nums中等于 val 的值

另一种循环移除方法

# while循环 + remove 解法
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        while val in nums:              # 当nums中有等于 val 的值时,循环条件成立
            nums.remove(val)            # 移除等于 val 的值的元素

结论:

与26题的思路相似,编写代码思路时,要考虑移除元素是否会导致索引变动(例如:nums中可能存在多个等于val且连续的元素)


参考资料:

【leecode】第26题:删除排序数组中的重复项_inganxu-CSDN博客

(Leetcode) 移除元素 - Python实现_小布归来了的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

inganxu

感谢您的支持!!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值