双指针的常见形式就是快慢指针和左右指针。左右指针一般用于顺序结构。左右指针是一个指针从最左端开始另一个指针从最右端开始然后逐渐往中间逼近。左右指针的结束条件一般是两个指针相遇或者错开也就是leftright(两个指针指向同一位置)leftright两个指针错开快慢指针又称为龟兔赛跑算法其基本思想就是使用两个速度不同的指针在数组或链表等序列结构上移动。今天要打卡的题目是移动零给定一个数组nums编写一个函数将所有0移动到数组的末尾同时保持非零元素的相对顺序。请注意必须在不复制数组的情况下原地对数组进行操作。示例 1:输入:nums [0,1,0,3,12]输出:[1,3,12,0,0]示例 2:输入:nums [0]输出:[0]提示:1 nums.length 104-2^31 nums[i] 2^31 - 1这道题目的解题思路是在本题中我们可以cur 指针来扫描整个数组另dest 指针⽤来记录⾮零数序列 的最后⼀个位置。根据cur 在扫描的过程中遇到的不同情况分类处理实现数组的划分。 在cur 遍历期间使[0, dest] 的元素全部都是⾮零元素 [dest 1, cur - 1] 的 元素全是零。算法流程a. 初始化cur 0 ⽤来遍历数组dest -1 指向⾮零元素序列的最后⼀个位置。 因为刚开始我们不知道最后⼀个⾮零元素在什么位置因此初始化为-1 b. cur 依次往后遍历每个元素遍历到的元素会有下⾯两种情况i. 遇到的元素是0 cur 直接 。因为我们的⽬标是让dest 1, cur - 1] 内 的元素全都是零因此当cur 遇到0 的时候直接 就可以让0 在cur - 1 的位置上从⽽在[dest 1, cur - 1] 内ii. 遇到的元素不是0 dest 并且交换cur 位置和est 位置的元素之后让 cur 扫描下⼀个元素。(1)因为dest 指向的位置是⾮零元素区间的最后⼀个位置如果扫描到⼀个新的⾮零元 素那么它的位置应该在dest 1 的位置上因此dest 先⾃增1 (2)dest 之后指向的元素就是0 元素因为⾮零元素区间末尾的后⼀个元素就是 0 因此可以交换到cur 所处的位置上实现[0, dest] 的元素全部都是⾮零 元素 [dest 1, cur - 1] 的元素全是零。public void moveZeroes(int[] nums) { int dest-1,cur0; for(;curnums.length;cur){ if(nums[cur]!0){ dest; int tempnums[cur]; nums[cur]nums[dest]; nums[dest]temp; } } }