LeetCode: 283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
方法一:
先找出不是0的数放入原数组,用一个指针记录更改数组后最后一个非0的下标,再用一个for循环将数组剩余的部分用0填充即可。
Python版:
class Solution: def moveZeroes(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ index = 0 for num in nums: if num != 0: nums[index] = num index += 1 while index < len(nums): nums[index] = 0 index += 1
Java版:
class Solution { public void moveZeroes(int[] nums) { int j = 0; for(int i= 0; i < nums.length; i++) { if (nums[i] != 0 ) nums[j++] = nums[i]; } for(int i=j; i < nums.length; i++) { nums[i] = 0; } } }
方法二:
快慢指针法:初始slow、fast 指针都指向下标0;开始移动fast指针,当fast指针不等于0是,左右指针对应元素互换; 初始化slow = 0,然后开始循环数组,遇到非0的数字,赋值给slow,slow 加1
循环slow走到len(nums) - 1,将剩余的index都替换成0.
Python版:
def moveZeroes(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ slow = fast = 0 while fast < len(nums): if nums[fast] != 0: nums[slow], nums[fast] = nums[fast], nums[slow] slow += 1 fast += 1
Java版:
public void moveZeroes(int[] nums) { int slow = 0, fast = 0; while (fast < nums.length) { if (nums[fast] != 0) { int tmp = nums[fast]; nums[fast] = nums[slow]; nums[slow] = tmp; low++; } fast++; } }
参考资料: