1.移动零

利用双指针,将数组划分为 3 个区间:

一开始,设指针 dest = -1,cur = 0,因为非 0 区间还未存在。cur 遍历数组会有两个情况:
1.元素为零。 ++cur,将该元素纳入 零 区间。
2.元素非零。 非零区间要多一个值,则需要扩展非零区间:++dest,然后与 cur 位置值交换。
循环结束条件为:cur 遍历完数组,没有待处理区间。

2.复写零

同样是双指针算法,但是从前往后模拟一遍,发现复写 0 会覆盖后面的值,所以不行。
试试从后往前,举第一个示例:从最后一个复写的数字 4 开始往前:

cur 遇到 0,往前走一步,dest 走两步并且修改为 0。cur 遇到非 0,往前走一步,dest 走一步,修改为 cur 所在值。
发现可行,答案正确。那现在需要:找到最后一个复写的数:很简单,从前往后再模拟一遍,就能找到最后一个复写的数。设 cur 为 0,dest 为 -1(把 dest 当作模拟复写完的区间,cur 为 0。0 到结尾都还未处理,全都没处理,那 dest 就在 cur 的左侧,一个空间不给)。
























