DESC:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
CODE:
JAVA:
class Solution { public void moveZeroes(int[] nums) { if (nums==null || nums.length==0) { return; } int n = nums.length; int left=0, right=0; for (int i=right; i<n;i++) { if (nums[right]!=0) { swap(nums, left, right); left++; } right++; } } public void swap(int[] nums, int left, int right) { int temp = nums[left]; nums[left] = nums[right]; nums[right] = temp; } }
CODE2:
class Solution { public void moveZeroes(int[] nums) { if (nums==null || nums.length==0) { return; } int n = nums.length; int left=0; for (int right=0; right<n;right++) { if (nums[right]!=0) { swap(nums, left, right); left++; } } } public void swap(int[] nums, int left, int right) { int temp = nums[left]; nums[left] = nums[right]; nums[right] = temp; } }
Python:
class Solution: def moveZeroes(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ if not nums: return left=0 for right in range(len(nums)): if nums[right] != 0: if left != right: temp = nums[left] nums[left] = nums[right] nums[right] = temp left+=1
NOTES:
- 双指针,left,right都从头部开始,left记录的是当前已经处理好的序列的尾部,即右侧为0,右指针指向待处理序列的头部,即在[left,right)区间是0。left指针指向的是待交换的0位置,right寻找的是右侧的非零位置,不断进行交换,直到右侧无非零元素;