题目:给定一个数组nums
,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
注:引入指针a(left)、b(right)
方法一:双指针a、b互换法
a、b同时从nums[0]出发;
如果b指向的不是0,执行【a、b互换】,【a向前一步】;如果b指向的是0,不执行;
【b向前一步】;
这样能够确保a指向当前检测到的第一个0处,b指向第一个0后的第一个非零数处;
def moveZeroes(self, nums):
a = 0
b = 0
while b < len(nums):
if nums[b] != 0:
nums[a], nums[b] = nums[b], nums[a]
a += 1
b += 1
变体:单指针+计数变量实现法
def moveZeroes(self, nums):
step_count = 0
for a, v in enumerate(nums):
if v == 0:
step_count += 1
continue
nums[a], nums[a - step_count] = nums[a - step_count], nums[a]
//作者:aliang
//链接:https://leetcode.cn/leetbook/read/all-about-array/x9rh8e/?discussion=88UVh7
//来源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法二:b找a填法
a、b从-1、0出发;
b负责查找当前第一个非零数;a负责从头连续排好所有非零元素;
b遍历完毕后/a排好后,把a指针后面的元素用0覆盖;
def moveZeroes(self, nums):
a = -1
b = 0
while b < len(nums):
if nums[b] != 0:
a += 1
nums[a] = nums[b]
b += 1
for k in range(a+1, len(nums)):
nums[k] = 0
方法三:巧用remove法
remove的功能是删除列表中第一个指定的值;对列表中所有的元素进行遍历,找到0元素后移除(remove)并在末尾填加(append)该0元素;
def moveZeroes(self, nums):
for i in nums:
if i == 0:
nums.remove(i)
nums.append(0)
//作者:ayi
//链接:https://leetcode.cn/leetbook/read/all-about-array/x9rh8e/?discussion=9qd9EE
//来源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。