算法:283. 移动零
题目

题目链接:leetcode 283.移动零
——————————————————————————————————————————————————-—————————
思路分析
对于小白来说,第一反应肯定是先遍历一遍数组,遇到0了,在和下一个数字交换。
试一下示例一种的数据,发现
1 0 0 3 12 之后,下一次交换就变成了 1 0 3 0 12
诶,显然不对了,要对这个方法进行改进。
很容易想到,如果只记录当前下标,无法把前面的0一起管理好,
于是我们就可以增加一个下标,也就是双指针算法
我们用两个指针,一个left,一个right,
left和right维护好的区间要求区间内的所有元素全部都是0,
这样子当我们的right == nums.size() - 1的时候,left和right区间内的所有元素就全都是0了,
而且从左向右遍历,所以非0元素的相对顺序也就不会改变了。
代码实现细节
我们首先将两个指针的初始值都初始化成1,
然后开始遍历数组,
当遇到0的时候,right++,
遇到非0的时候,首先将非0的元素与left下标元素交换位置,接着left++,这时right的位置就变成0了,所以right也++,
我们发现两种情况都有right++,就可以将right写在判断的外面,这样代码更优雅一些。
注意:当我们以right为基准去遍历数组,写成for循环的时候,如果我们在循环体里面写了right++,那么在for循环的第三个部分就不要写right++了,避免重复++。
void moveZeroes(vector<int>& nums) {int left = 0,right = 0;for(right = 0;right < nums.size();){if(nums[right] != 0){swap(nums[left],nums[right]);left++;}right++;}}
