给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度5,并且 nums 中的前五个元素为0,1,3,0,4
方法一:直接使用删除的方法(简单版)
class Solution:
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
l = len(nums)
i = 0
while i<l:
if nums[i]==val:
nums.remove(nums[i])
l-=1
else:
i+=1
return len(nums)
小结:注意这里使用的列表如果使用删除的话,列表的索引会自动跟着变化的, 从删除的位置之后所有的元素会整体向前移,所以这点是关键,需要注意,给个例子,你就会明白。
li = [1,2,2,3,4,5,6]
for i in range(len(li)):
if li[i]==2:
li.remove(li[i])
print(li[i])
Traceback (most recent call last):
1
2
3
4
5
6
File "E:/python代码文件/作业/Tensorflow/Tersorflow-1.py", line 7, in <module>
if li[i]==2:
IndexError: list index out of range
Process finished with exit code 1
从这里可以看出,当删除第一个2之后,第二个2会向前移动,索引也会跟着变化,第二个的2的索引从开始的2变成后来的1(索引),所以你会看到还有2输出(我们的本意是删除列表中所有2,有没有发现,当我们用列表时,使用删除的操作的时候,要格外注意这点),当然len(li)也就变化了吗。即从删除的地方开始所有后面的元素会整体向前移动。
第二种方法:双指针的方法
这个和前面的一题极其的相似,可以对照着看下。
class Solution:
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
i =0
j =0
for i in range(len(nums)):
if nums[i]!=val:
nums[j]=nums[i]
j+=1
else:
continue
return j