直接上题:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
解题思路:
- 把0移动到数组的尾端,涉及到元素的改变,即前后同一索引但元素可能已经不一致
- 非零元素的顺序不变,除了零以外的元素,之前怎么排,之后也该怎么排
- 声明一个变量
index = 0
,用于交换非零元素。 - 遍历数组,把非零元素一个个按顺序放到前面,所以每放一个非零元素后,index都加1,用来存放下一个非零元素。
上代码:
/**
* @author 此间乐
* @create 2020-12-15-21:38
*/
public class MoveZeroes {
public void moveZeroes(int [] nums){
int index = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0){ //从第0个开始遍历,找到不为0的元素
nums[index] = nums[i]; //把不为0的元素 放到前面去
index = index + 1; //该索引位置的元素,替换成了不为0的元素,index索引加1,存放下一个不为0的元素
}
}
for (int i = index; i < nums.length; i++) { //上一个循环已经把不为0的元素全部放到前面去了,所以,在同一个数组中,剩余的元素都是0
nums[i] = 0; //把index后元素置为0
}
}
}