leetcode移动零
Given an integer array nums, move all 0’s to the end of it while maintaining the relative order of the non-zero elements.
Note that you must do this in-place without making a copy of the array.
Example 1:
Input: nums = [0,1,0,3,12]
Output: [1,3,12,0,0]
Example 2:
Input: nums = [0]
Output: [0]
方法一:把非0的往前挪
把非0的往前挪,挪完之后,后面的就都是0了,然后在用0覆盖后面的。这种是最容易理解也是最容易想到的,代码比较简单,这里就以示例为例画个图来看下
public static void moveZeroes(int[] nums) {int n=nums.length;int index=0;for (int i = 0; i < n; i++) {if (nums[i]!=0){//一次遍历,把非零的都往前挪nums[index++]=nums[i];}}//后面的都是0while (index<n){nums[index++]=0;}}
方法二:参照双指针解决
这里可以参照双指针的思路解决,指针j是一直往后移动的,如果指向的值不等于0才对他进行操作。而i统计的是前面0的个数,我们可以把j-i看做另一个指针,它是指向前面第一个0的位置,然后我们让j指向的值和j-i指向的值交换
public static void moveZeroes2(int[] nums) {int i=0;//统计前面0的个数for (int j = 0; j < nums.length; j++) {if (nums[j]==0){//如果当前数字是0就不操作i++;}else if (i!=0){//否则,把当前数字放到最前面那个0的位置,然后再把//当前位置设为0nums[j-i]=nums[j];nums[j]=0;}}}
方法三:非0与0交换
public void moveZeroes3(int[] nums) {int i = 0;for (int j = 0; j < nums.length; j++) {//只要不为0就往前挪if (nums[j] != 0) {//i指向的值和j指向的值交换int temp = nums[i];nums[i] = nums[j];nums[j] = temp;i++;}}}
和方法一类似