移动零
题目
移动零(力扣:283)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
分析
使用双指针解决。
方法一:用2个指针i指向当前遍历的节点,j指向已排好序的当前非零节点的后一位。i指针位置的当前节点,如果是非零,则交换i和j的位置。
方法二:第一次遍历将非零节点都移动到数组的前面,并计算出非零节点的数量s,完成遍历后,第二次遍历从s开始一直到数组末尾,设置为0即可。
代码实现:方法一
/**
* 283. 移动零
* @param nums
*/
public void moveZeroes(int[] nums) {
if (nums == null){
return;
}
int i = 0, j = 0;
int tmp;
while (i <nums.length){
if (nums[i] != 0){
tmp = nums[j];
nums[j] = nums[i];
nums[i] = tmp;
j++;
}
i++;
}
}
代码实现:方法二
/**
* 283. 移动零
*
* @param nums
*/
public void moveZeroes2(int[] nums) {
if (nums == null || nums.length <= 1) {
return;
}
int s = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
nums[s] = nums[i];
s++;
}
}
for (int i = s; i < nums.length; i++) {
nums[i] = 0;
}
}