LeetCode:27.移除元素

解题思路:

思路一:

  • 双指针,一前一后
  • 前指针往后遍历,找到val则停止
  • 后指针若该数不为val,则交换,若为val,向前遍历
  • 前后指针相等的时候,退出循环。

思路二:

  • 先排序,后遍历寻找(可以用二分查找找到),找到后删了,将后免得元素往前挪。

问题:

思路一在写的过程中有问题,即只有一个数字的时候,while循环会直接跳出,begin=0,又或者[3,3] 3,  [2],3    [1],1  的时候也会出问题。正常情况下是可以的,很烦。看题解吧,之后在改

错误代码:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        if len(nums) == 0 or (nums[0] == val and len(nums) == 1):
            return 0
        if len(nums) == 1 and nums[0] != val:
            return 1
        begin, end = 0, len(nums)-1,
        while begin != end:
            if nums[begin]==val:
                while nums[end] == val:
                    end-=1
                t = nums[begin]
                nums[begin] = nums[end]
                nums[end] = t 
            begin+=1  
        return begin

题解:

  • 。。。。。。。。。。。无语了,我的思路是没问题的,但细节的处理方式不对,一开始end赋值为长度减1,循环里又有end-1,若只有一个元素,会导致溢出,这也是我一直想不到怎么解决的问题,
  • 同时还存在另一个问题。就是我的循环里每次用一个while循环让end左移,这就存在一个情况,即end可能小于begin,除非每次再加一次判断。
  • 突然发现还有一个问题,就是while条件!=,如果在某次循环里end小于begin了,会导致死循环

解决方法:

每次将end直接赋值给begin,然后左移,若end的值为val也没关系,因为只有当begin的值不为val时,begin才会右移。

代码:

  1. python:
    class Solution:
        def removeElement(self, nums: List[int], val: int) -> int:
            begin, end = 0, len(nums),
            while begin != end:
                if nums[begin]==val:
                    nums[begin] = nums[end-1]
                    end-=1
                else:
                    begin+=1  
            return begin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值