给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes
(1)双指针1
① 定义快慢指针 slow 和 fast,其中 slow 指向当前已经处理好的序列的尾部,fast 指向待处理序列的头部。
② 初始时 slow 和 fast 均指向数组的第一个元素。然后 fast 不断向右移动,每次 fast 指向非零数时,则将 slow 和 fast 对应的数交换,同时 slow 右移。
③ 结束之后,数组中所有的 0 都移动到了末尾,同时也保持非零元素的相对顺序。
(2)双指针2
① 去除数组nums中的所有 0,并返回去除0之后的数组长度newLen(非零元素的相对顺序保持不变),这里需要复用LeetCode_双指针_简单_27.移除元素这题的代码。。
② 将数组nums中索引在newLen及之后的所有元素赋值为 0即可。
//思路1————双指针1 public void moveZeroes(int[] nums) { int length = nums.length; int slow = 0,fast = 0; while(fast < length){ if(nums[fast]!=0){ //将每一个不为0的元素nums[fast]移动到数组前面,那么数组末尾的元素均为0 swap(nums,slow,fast); //交换之后nums[slow]的值不为0,slow指针右移一位 slow++; } fast++; } } //交换nums[slow]和nums[fast]的值 public void swap(int[] nums,int slow,int fast){ int temp = nums[slow]; nums[slow] = nums[fast]; nums[fast] = temp; }
//思路2————双指针2 public void moveZeroes(int[] nums) { //去除数组nums中的所有 0,并返回去除0之后的数组长度 int newLen = removeElement(nums, 0); //将newLen之后的所有元素赋值为 0 while(newLen < nums.length){ nums[newLen++]=0; } } //复用 LeetCode_双指针_简单_27.移除元素 的代码 int removeElement(int[] nums, int val) { int fast = 0, slow = 0; while (fast < nums.length) { if (nums[fast] != val) { nums[slow++] = nums[fast]; } fast++; } return slow; }