- Problem:
Given an array
nums
, write a function to move all0
's to the end of it while maintaining the relative order of the non-zero elements.For example, given
nums = [0, 1, 0, 3, 12]
, after calling your function,nums
should be[1, 3, 12, 0, 0]
.Note:
- You must do this in-place without making a copy of the array.
- Minimize the total number of operations.
- analysis:
维持两个指针. 实际上就是将所有的非0数向前尽可能的压缩,最后把没压缩的那部分全置0就行了。比如103040,先压缩成134,剩余的3位全置为0。过程中需要一个指针记录压缩到的位置。
- anwser:
方法1比方法2更优,主要是一次性将非零数排列好,比方法2减少了多余的移动时间。
1
双指针压缩法 public class Solution { public void moveZeroes(int[] nums) { int i=0; int j=0; while(j<nums.length) { if(nums[j]!=0) { if(j!=i) { nums[i++] = nums[j]; nums[j] = 0; } else { ++i; } } ++j; } } }
2
从后向前遍历法
public class Solution { public void moveZeroes(int[] nums) { int i,j,temp; int zeroflag=nums.length-1 ; for(i=nums.length-1;i>=0;i--){ if(nums[i]!=0) continue; else { temp = nums[i]; for(j=i;j<zeroflag;j++){ nums[j]=nums[j+1]; } nums[zeroflag]=temp; zeroflag--; } if(i==0) break; } } }