283. Move Zeroes
一、题目
1、审题
2、分析
给出一个整形数组,将 0 全部提到后边,并保持非 0 元素的排列顺序。
二、解答
1、思路
方法一、
采用两个指针,index1 指向 第一个 0 的下标。i 指向新出现的元素的下标。
若 nums[i] = 0,则 i++;
若 nums[i] != 0, 且 i != index1,则交换 i 与 index1 所指向的两个元素值;且 index1++,i++;
最终结果为,将出现的 0 连起来,将后边的非 0 元素与前边的 0 序列的最前头一个进行交换。
public void moveZeroes(int[] nums) { int len = nums.length; int ind1 = 0; for (int i = 0; i < len; i++) { if(nums[i] == 0) { if(nums[ind1] != 0) ind1 = i; continue; } if(i > ind1 && nums[ind1] == 0) { swap(nums, ind1, i); ind1++; } } } private void swap(int[] nums, int i, int j) { int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; }
方法二、
改进:
最终结果为,非0数全在前边, 0 在后边。
public void moveZeroes3(int[] nums) { int j = 0; for (int i = 0; i < nums.length; i++) { if(nums[i] != 0) { if(i != j) swap(nums, i, j); j++; } } }
方法三、
新建变量 insertPos=0; 将非 0 元素直接前移到 insertPos 位置,然后 insertPos++;
最终若 insertPos < len;在将剩下的元素赋值 0;
public void moveZeroes2(int[] nums) { int insertPos = 0; for(int num: nums) if(num != 0) nums[insertPos++] = num; while(insertPos < nums.length) nums[insertPos++] = 0; }