给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数
解题思路1---暴力解法
1.遍历nums,碰到0,位置i,记录为第j个0,
2.如现在为第一个0
3.把i+1 和n-j-1 个元素前移
4.把第n-j个元素设置为0
5.继续从第i个位置查找0 ,重复1-4
6.直到i ==n-j,终止
static void moveZeroes(int[] nums){
int j = 0;
int i = 0;
int n = nums.length;
//寻找非0
while( i < n-j ){
if(nums[i] != 0){
i++;
continue;
}
j++;
//碰到0 ,前移
for(int k = i;k < n-j;k++){
nums[k] = nums[k+1];
}
nums[n-j] =0;
}
}
解题思路2---优化---类似冒泡思想
1.i,j=0,从第i个开始遍历数组,j表示前面j-1个都已经替换为非0了
2.1判断num[i]为非0,把num[i] 放入nums[j],j++,然后把nums[i]置为0
2.2这里要注意i==j的情况,表示第i个前面一直都是非0,不要把nums[i]置为0
3.遍历到结束
for (int i = 0, j = 0; i < nums.length; i++) {
if (nums[i] != 0) {
nums[j] =nums[i];
if(i != j){
nums[i]=0;
}
j++;
}
}
、