说明是:
给定一个数组nums和一个值val,就地删除该值的所有实例并返回新的长度。
不要为另一个数组分配额外的空间,必须通过使用O(1)额外的内存就地修改输入数组来做到这一点。
元素的顺序可以更改。超出新长度后剩下的都无所谓。
这是我的解决方案,但它说我的输出返回的是数组的前两个元素,而不是后两个?
输入:[3,2,2,3]
我的输出:[3,3]
预期:[2,2]
def removeElement(self, nums, val):
count = 0;
for i in nums:
if nums[i] == val:
temp = nums[count]
nums[count] = nums[i]
nums[i] = temp
count=count+1
nums = nums[count:]
return len(nums)
尽管您对线性算法有正确的想法,但这里仍然存在一些问题。
for i in nums:
,那么nums[i]
在循环块中是一个常见的Python错误。它不会像您想象的那样遍历索引。实际上,它遍历元素!使用for i, element in enumerate(nums):
或for i in range(len(nums))
获取索引。避免这种情况的一种好方法是永远不要i
用于索引。调用它n
,num
或elem
使其更容易避免混乱。
另一个误解是nums = nums[count:]
。这根本不会修改呼叫者的列表数据,只会重新分配局部变量nums
以指向呼叫者列表的副本,这不是您想要的。修改呼叫者列表的唯一方法是为每个索引分配一些内容。
一种简单的方法是遍历列表并将与目标不匹配的元素移动val
到列表的前面。指针length
位于i
变量后面,指示结果的长度以及下一个选定项目的放置位置。
def removeElement(self, nums, val):
length = 0
for i in range(len(nums)):
if nums[i] != val:
nums[length] = nums[i]
length += 1
return length
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句