4.移动零
小于 1 分钟
4.移动零
参考链接
个人尝试
j 向后遍历寻找 非零值,i 也向后遍历寻找 0;
当各自找到目标值,i < j ,并且 i 、 j 不越界则交换位置。
class Solution {
// 代码有点复杂化了
public void moveZeroes(int[] nums) {
if (nums == null || nums.length == 0 || nums.length == 1) return;
int i = 0;
int j = 0;
while(j < nums.length && i < nums.length) {
while (j < nums.length && nums[j] == 0) j++;
while (i < nums.length && nums[i] != 0) i++;
// [0,1,0,3,12]
if (j >= nums.length || i >= nums.length) break;
// [1, 0], [1, 0, 1]
if (i > j) {
j++;
continue;
}
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
}
优秀题解
官方题解评论区的发言
![image-20241108105736779](/assets/image-20241108105736779-Zq6onmcu.png)
执行用时最优的题解
class Solution {
// 用 i 记录「新数组」的 index,j 遍历「旧数组」中不为0的 index
public void moveZeroes(int[] nums) {
int i = 0;
for (int j = 0; j < nums.length; j++) {
// if (nums[j] != 0 && i != j) ==> 遇到[2, 1]出错
if(nums[j] != 0) {
nums[i] = nums[j];
// [1, 0]
if (i != j) nums[j] = 0;
i++;
}
}
}
}