leetcode_27_移除元素

1 题目

地址:https://leetcode-cn.com/problems/remove-element/
在这里插入图片描述

2 我的提交

方法一

我能想到的最简单的方法,就是从头到尾遍历数组,如果遇到和val相等的就将sum(sum表示到该索引时,前面有多少个和val相等的书)数量+1,如果不相等的,就将该元素往前移动sum个位置就行了。
看下面的代码可能更加清楚

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        lenght = len(nums)
        sum = 0
        for i in range(lenght):
            if nums[i] == val: # 当前元素为要去掉的
                sum += 1 # 记录数量
            else:
                nums[i-sum] = nums[i] # 直接移sum个位置就行了
        return lenght - sum

方法二

相当于重构数组,直接设置一个索引temp用于记录和val不相等的数的下标,一个一个遍历数组,如果该数不等于val,那么就将该数存在数组的temp下标位置,并且temp自加1。代码如下:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        lenght = len(nums)
        temp = 0 # 用于存储和val不相等的数的数组下标
        for i in range(lenght):
            if nums[i] != val: # 如果和val不相等
                nums[temp] = nums[i] # 直接将该数存在temp位置
                temp += 1 # temp自加
        return temp # 最后的结果就是temp的大小
        # 这里解释一下为什么temp的大小就是最后数组的数量,因为temp是后加的,是存储了元素之后
        # 再加的1,并且数组是从0下标开始的,所以temp的大小就是最后数组的元素多少

上面这个方法也叫做双指针法,下面是用while实现的,其实都差不多,下面这段代码是从leetcode上复制过来的

class Solution:
    """双指针法
    时间复杂度:O(n)
    空间复杂度:O(1)
    """

    @classmethod
    def removeElement(cls, nums: List[int], val: int) -> int:
        fast = slow = 0

        while fast < len(nums):

            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1

            # 当 fast 指针遇到要删除的元素时停止赋值
            # slow 指针停止移动, fast 指针继续前进
            fast += 1

        return slow

方法三

正向遍历用pop,pop操作会删除一个元素后,把后面的元素自动前移,不好的地方就是要隔sum来记录数量,以及还要用append添加元素,因为如果不添加的话,i会超出数组的索引,有些冗余的地方

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        lenght = len(nums)
        i = 0
        sum = 0
        while i != lenght:
            if nums[i] == val:
                sum += 1
                nums.pop(i)
                nums.append(-1)
                i -= 1
            i += 1
        return lenght - sum

别人在leetcode上贴的代码,感觉比我的要好一些,这里直接用count来记录已经删了的数量,然后就不需要append了

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        count = 0
        if nums == []:
            return 0
        for i in range(0,len(nums)):
            if nums[i-count] == val:
                nums.pop(i-count)
                count += 1
        return len(nums)

方法四

直接逆向遍历用pop方便的一批,代码简介,不过就是速度慢了点

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        lenght = len(nums)
        for i in range(lenght-1, -1, -1): # 这里设置步长为-1,相当于-1,然后到0停止
            if nums[i] == val:
                nums.pop(i)
        return len(nums)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值