移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
In [1]:
class Solution:
def moveZeroes(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
zero_id = -1
zero_repeated = 0
for i in range(0, len(nums)):
if zero_id >= 0:
if nums[i] != 0:
nums[i], nums[zero_id] = nums[zero_id], nums[i]
zero_id = i - zero_repeated
else:
zero_repeated += 1
elif nums[i] == 0:
zero_id = i
这里的思路是,记录了 需要交换的0值 下标,然后还记录了一个 重复出现的0值 次数,通过 i值 来确定下一个 需要交换的0值 下标。
但是这样子还是太复杂了。。而且写代码时候因为思路不够清晰,出了很多问题。
改正¶
参考了一下其他的人代码,发现我一开始的思路是对的,但是在实际编码中还是想的太复杂了。
题目本质是将 非0元素 提前,那么只要遇到 非0元素 就将其交换,然后交换下标前移一位。
这样最终遍历完成,也就得出了正确结果。
更正后的代码如下:
In [2]:
class Solution:
def moveZeroes(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
point = 0
for i in range(len(nums)):
if nums[i]:
nums[i], nums[point] = nums[point], nums[i]
point += 1
这道题其实简单,但是我给钻入牛角尖了,实际上并没有那么复杂。。吸取教训。。
Comments !