移动零

leetCode–283(移动零)

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

1
2
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

1
2
输入: nums = [0]
输出: [0]

解法一:双指针

定义两个指针,分别为左指针(l)和右指针(r)。

使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。

右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移

代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public void moveZeroes(int[] nums) {
int n = nums.length;
int l = 0;
int r = 0;
while (r<n){
if (nums[r]!=0){
int t = nums[r];
nums[r] = nums[l];
nums[l] = t;
l++;
}
r++;
}
}
}

解法二

遍历数组,遇到不为0 的数则放入数组的最前面,遇到0则继续遍历。

放入的位置通过一个坐标(index)控制,进行向后移动,

最后将index到最后之间的数设置为0;

代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public void moveZeroes(int[] nums) {
int index = 0;
for (int i = 0;i<nums.length;i++){
if (nums[i]!=0){
nums[index] = nums[i];
index++;
}
}
for (int i = index;i<nums.length;i++){
nums[index++] = 0;
}
}
}

移动零
http://example.com/2022/06/09/移动零/
作者
zlw
发布于
2022年6月9日
许可协议