所以leetcode中有一个问题很简单,但第二个解决方案不正确: (OG问题: 给定一个数组nums,写一个函数将所有0移动到它的末尾,同时保持非零元素的相对顺序。
例如,给定nums = [0,1,0,3,12],在调用函数后,nums应为[1,3,12,0,0]。
注意: 您必须就地执行此操作,而无需复制阵列。 最小化操作总数。 )
class Solution(object):
def moveZeroes(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
k = 0
for ele in nums[:]:
if ele == 0:
nums.remove(0)
k += 1
nums.extend([0]*k)
class Solution(object): -------Incorrect solution
def moveZeroes(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
k = 0
for ele in nums:
if ele == 0:
nums.remove(0)
k += 1
nums.extend([0]*k)
为什么这会产生影响呢?
答案 0 :(得分:0)
您可以不复制列表,也不能在循环播放时修改列表:
class Solution(object):
def moveZeroes(self, numbers):
"""
:type numbers: List[int]
:rtype: void Do not return anything, modify numbers in-place instead.
"""
k = 0
while True:
try:
numbers.remove(0)
k += 1
except ValueError:
break
numbers.extend([0] * k)
numbers = [0, 1, 0, 3, 12]
print(id(numbers), "->", numbers)
Solution().moveZeroes(numbers)
print(id(numbers), "->", numbers)
<强>输出:强>
(4348993904, '->', [0, 1, 0, 3, 12])
(4348993904, '->', [1, 3, 12, 0, 0])
答案 1 :(得分:0)
循环播放列表时无法修改列表。这在Python中是非法的。
[:]
制作列表的独立副本以进行循环。
但问题要求您不要复制列表,因此两种解决方案都不正确。
我不会告诉你究竟如何修复它因为我想让你学习,但是你应该创建一套。每当您使用.remove()
时,请将其添加到集合中。在开始for循环之前检查元素是否在集合中。在循环结束时,实际上从列表中删除集合中的元素。
要创建集,请使用set()
。要向集合添加元素,请使用set_name.add()
不要使用leetcode来学习Python。 Leetcode用于技术编码访谈,你的python不是很好。你不会通过面试。
您的代码违反了PEP 8,您的课程不会继承object
。你的缩进也是错误的,这导致Python出错。得到像PyCharm这样的编辑器(它是免费的)可以在将来警告你这些错误。这是一个很棒的IDE,认真一点,尝试一下。