【发布时间】:2017-05-05 06:25:24
【问题描述】:
我正在尝试为给定的数组和一个值编写一个程序,以删除该值的所有实例并返回新的长度。
示例: 给定输入数组 nums = [3,2,2,3], val = 3
它应该返回length = 2,nums的前两个元素是2。
这是我的代码:
代码 1:
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
i = 0
j = len(nums) - 1
while i <= j:
while i <= j and nums[j] != val:
j -= 1
while i <= j and nums[i] == val:
i += 1
if i <= j:
nums[i], nums[j] = nums[j], nums[i]
return len(nums[i:])
这会以相反的顺序返回数组切片。
Input:
[3,2,2,3]
3
Output: [3,3]
Expected: [2,2]
但是,如果我在代码 1 的末尾稍作修改,它会给我正确的输出:
nums[:] = nums[i:]
return len(nums[i:])
代码 2:
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
i = 0
j = len(nums) - 1
while i <= j:
while i <= j and nums[j] != val:
j -= 1
while i <= j and nums[i] == val:
i += 1
if i <= j:
nums[i], nums[j] = nums[j], nums[i]
nums[:] = nums[i:]
return len(nums)
我无法弄清楚为什么我的代码 1 不起作用。有人可以帮我理解为什么 slice 不能按预期工作吗?
【问题讨论】:
-
我认为这两种方法都行不通,除非您对未提及的输入有一些限制。
-
奇怪的是我运行了你的 code1 并且它按预期工作,即输入 [3,2,2,3] 返回 [2,2] 和长度 2。