283. Move Zeroes
Given an array nums
, write a function to move all 0
'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.
解法:
public class Solution {
public void moveZeroes(int[] nums) {
//回归 2016-12-01
//思路,两个指针,一个指着第一个等着被换的0;一个指着后边要往前换的
//这个思路下有两种方法,一种动第一个指针,一种动第二个指针
//这里是第一个指着0的动;
int zero = 0;
int notz = 0;
int len = nums.length;
while(zero<len){
if(nums[zero]==0){
if(notz<zero)notz = zero+1;//这里要注意:如果不加判断,每次都notez = zero+1;也对,time==20ms;
while(notz<len && nums[notz]==0)notz++;
if(notz==len)return;
nums[zero] = nums[notz];
nums[notz] = 0;
}
zero++;
}
}
}
time:1ms;
解法二:
public class Solution {
public void moveZeroes(int[] nums) {
//回归 2016-12-01
//思路,两个指针,一个指着第一个等着被换的0;一个指着后边要往前换的
//这个思路下有两种方法,一种动第一个指针,一种动第二个指针
//这里是第二个动;
int zero = 0;//前边的为0要被换掉的
int notz = 0;//后边的不为0 的要往前换的
int len = nums.length;
while(notz<len){
if(nums[notz]!=0){
if(notz==zero)zero++;
else{
nums[zero] = nums[notz];
nums[notz] = 0;
zero++;
}
}
notz++;
}
}
}
这里要注意,在这里,只要有一个0之后,zero就一直指0 了。zero与notz之间只能有0是空隙。
因为有几个0,zero就会慢走几次。