283.移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。
示例1
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例2
输入: nums = [0]
输出: [0]
分析
题目是要在原地将所有0移动到数组的末尾。首先要知道,怎么确定0的位置以及个数。
如果说通过遍历去确定0的位置以及个数的话,那么在找0的过程中,是不是就可以同时移动他们,那么就需要两个标志位,一个负责找零,一个负责移动。
实现
- 使用双指针遍历的同时交换元素
class Solution { public void moveZeroes(int[] nums) { int slow = 0,fast = -1; while(++fast<nums.length) if(nums[fast]!=0) swap(nums,fast,slow++); } public void swap(int[] nums,int l,int r){ if(nums[l]==nums[r]) return; nums[l]^=nums[r]; nums[r]^=nums[l]; nums[l]^=nums[r]; } }
- 第一次遍历既然可以知道0的个数,那么当fast指针走到头的时候,fast-slow就是0的个数,直接补0即可
class Solution { public void moveZeroes(int[] nums) { int slow = 0,fast = -1; while(++fast<nums.length) if(nums[fast]!=0) nums[slow++] = nums[fast]; while(slow<fast) nums[slow++] = 0; } }
Comments | NOTHING