给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12] 输出: [1,3,12,0,0]说明:
必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。如果要求将数组中的0全部移动到数组的后面,而无关心非零元素的位置情况,那么我们可以使用荷兰国旗问题的思路求解,代码如下:
class Solution { public void moveZeroes(int[] nums) { if(nums == null){ return; } int left = 0; int right = nums.length - 1; while(left < right){ if(nums[left] == 0){ swap(nums, left, right--); } left++; } } public void swap(int[] nums, int i, int j){ int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } }但是题目要求保证非零元素的相对顺序不能发生改变,那么这种方法就无能保证了。我们可以使用快慢指针的思想,将非零元素全部移动到数组的前面,然后将非零元素后面的部分全部置零即可,思路如下:
解题代码如下:
class Solution { public void moveZeroes(int[] nums) { if(nums == null){ return; } int index = removeZero(nums, 0); for(int i = index; index < nums.length; index++){ nums[index] = 0; } } public int removeZero(int[] nums, int val){ int slow = 0; int fast = 0; while(fast < nums.length){ if(nums[fast] != val){ nums[slow++] = nums[fast]; } fast++; } return slow; } }