27. 移除元素

27. 移除元素

总结:
	fun2()代码过程:
		--q从后往前遍历,依次找到从右往左的,不需删除元素
		--q遍历结束,依次找到从左往右的,第一个需要删除元素
			进行交换
		--这样删除元素跑到了后面
		--重复以上步骤
	注意:
		在fun1(),我是s<q,return s+1,这导致了[1] 1的输入未通过
		所以在fun2(),修改为了,s<=q return s
		
		这样做的好处:
			如果是q向左移动过程中,越过了s,那么s位置一定是满足条件的
			如果s向右移动的过程中越过了,q那么s位置一定是满足条件的
		
	为何会有这样的思路:
		在与题目要求<<原地删除>>和元素顺序可改变

	答案代码:
		fun3(),本质上没啥区别
		但是采用了覆盖,和s不动
		就是每一次都只对s是否为val进行判断
		而不对q进行判断,原因在于:
			#直接覆盖,不进行交换,如果是val,那么不影响,
			#如果不是val,那么正好删除,然后这个元素后面也不会遇到了
		然后你不知道q换过来的是什么?所以s不动,q-1

提交没有通过 [1] 1 这个的答案有问题

'''
    理解题目:
        给的无序nums,和val,删除nums中的所有val
        要求:
            原地
            元素顺序可以改变
        我所写的算法不需要具有<<稳定性>>
        返回值,整数

    既然是原地修改,就是将数字val移动到最后面对吧?

'''
def fun1(nums,val):#[1] 1 这个测试用例无法通过
    s = 0
    q = len(nums) - 1
    while s < q:
        if nums[q] == val:
            q -= 1  # 移动到,没有val的位置,后面的val不需要动
        else:
            if nums[s] != val:
                s += 1
            else:
                nums[s], nums[q] = nums[q], nums[s]
                s += 1
    return s + 1
print(fun1([0,1,2,2,3,0,4,2],2))

fun1()的更改,修改了s<=q,这样就好了

def fun2(nums,val):
    s = 0
    q = len(nums) - 1
    while s <=q:
        if nums[q] == val:
            q -= 1  # 移动到,没有val的位置,后面的val不需要动
        else:
            if nums[s] != val:
                s += 1
            else:
                nums[s], nums[q] = nums[q], nums[s]
                s += 1
    return s

答案使用的也是双指针,不过是采用了覆盖和s不动


def fun3(nums,val):
    s=0
    q=len(nums)-1
    while s<=q:
        #这里带不带等号?
        #如果带等号,s==q时,如果s是val,进行覆盖,然后q越过
        #如果s不是val,s越过

        #如果不带等号,相当于,s==q这里没有判断过
        #那么会出现明明满足条件,却没有带她
        if nums[s]==val:
            nums[s]=nums[q]  #直接覆盖,不进行交换,如果是val,那么不影响,如果不是val,那么正好删除,然后这个元素后面也不会遇到了
            q-=1
        else:
            s+=1 #不是val,往后面移动一个
    return s
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值