• 2.5

    • 忘了逻辑了:不管 fast 是不是 0 都要 fast++,不管是不是等于,都要 slow++
  • 1.22

    • 忘了temp 取得是 num【fast】了,而不是 fast 数组下标
class Solution {
    public void moveZeroes(int[] nums) {
        int slow = 0;
        int fast = 0;
 
        while(fast!=nums.length){
            if(nums[fast]!=0){
                if(slow!=fast){
                    int temp =nums[slow];
                    nums[slow] = nums[fast];
                    nums[fast] = temp;
                }
                slow++;
            }
            fast++;
        }
    }
}

双指针在一起的情况

  • 1.6
    • 快慢指针,慢指针留着位置放好书,快指针扫描好书扔给慢指针,只有快指针遇到非零元素,进入判断,快慢指针是否相等,如果位置不相等,说明中间隔着 0
    • [1, 0, 2]
      • 只要 快指针 和 慢指针 不相等,就说明 快指针 曾经跨越过 0,而 慢指针 正指着那个 0(或者一串 0 的第一个),等着现在的这个非零数 nums[快指针] 来把这个 0 换走。

结合你的例子 [1, 0, 2] 看代码执行:

  1. 遇到 1 (非零)

    • fast 发现是 1。

    • swap (自己换自己)。

    • slow 往前走(slow 变成 1)。

    • fast 往前走(fast 变成 1)。

    • 此时 slowfast 都在下标 1

  2. 遇到 0

    • fast 发现是 0。

    • if 进不去 slow 没有动! (停在下标 1,等着接书)。

    • fast 继续往前走(fast 变成 2)。

    • 此时 slow=1, fast=2。距离拉开了!

  3. 遇到 2 (非零)

    • fast 发现是 2。

    • if 进去了。

    • swap:把 nums[fast] (也就是 2) 扔给 nums[slow] (下标 1 的位置)。

    • slow 往前走。

    • fast 往前走。

总结: 跑得快、负责遍历的是 fast (i);跑得慢、负责占坑的是 slow (j)。

class Solution {
    public void moveZeroes(int[] nums) {
        int slow = 0;
        int fast =0;
 
        while(fast<nums.length){
            if(nums[fast]!=0){
                if(fast!=slow){
                    int temp = nums[slow];
                    nums[slow] = nums[fast];
                    nums[fast] = temp;
                }
                slow++;//只有快指针找到非零元素,慢指针才会往前走,它始终指向**“下一个非零元素应该摆放的位置”**。
            }
            fast++;
        }
    }
}