leetcode-移动0 把0看作null也许会更好理解

Sal Lv1

力扣移动零,如果把0看作空可能更好理解

alt text

最普遍的做法是双指针,一个指针放在初始位置,一个指针不断地向后遍历。

其实有一个很好理解的思路,就是把0看作null,就非常好理解这个过程。

我们需要做的就是 在快指针(或者说右指针)不断向后遍历的过程中,如果当前遍历到的数是非null(也就是不为0)我们就把他向前移动。也就是说,把他填充到前面的第一个空的位置上(放到原题来看,就是放到前面第一个不为0的位置上)。

先看代码逻辑:

1
2
3
4
5
6
7
while(fast<nums.length){
if(nums[fast]!=0){
nums[slow]=nums[fast];
slow++;
}
fast++;
}

为了方便理解,还是看图。
alt text

发现1不为0,执行逻辑,nums[0]和nums[0]交换,没有任何影响。

此时左右(快慢)指针同时加1.

alt text
遇到2,同理。

alt text
这个时候 发现遇到了为空(0)的元素,这时候,右指针(快指针)就要不断向后遍历寻找下一个不为0的元素了。

直到:
alt text
此时,就进行填充,填充第一个为空的元素(也就是为0的元素)

alt text

执行完这一层while的逻辑,就是像上面这张图这样。
那这段while执行完会是怎样的呢?
alt text
有没有发现,我们已经把所有非空(0)的元素按照相对位置这段序列放到了整个数组的前段部分,并且左指针指向的位置就是这个序列末尾的下一个位置。那这个时候,我们只要用左指针遍历到末尾,将所有的元素置为空(0),也就满足了我们题目的需求。

1
2
3
4
while(slow<nums.length){
nums[slow]=0;
slow++;
}
  • 标题: leetcode-移动0 把0看作null也许会更好理解
  • 作者: Sal
  • 创建于 : 2025-07-03 17:40:30
  • 更新于 : 2025-07-25 22:13:22
  • 链接: https://redefine.ohevan.com/posts/48828/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
leetcode-移动0 把0看作null也许会更好理解