总结:
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