解题思路:
思路一:
- 双指针,一前一后
- 前指针往后遍历,找到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才会右移。
代码:
- 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