题目链接
题目理解
这道题很好理解,就是将数组中的0放到末尾,不改变非0数据的顺序即可。
解题思路
1.删除0方法(易理解,但不推荐)
先找到所有的0并删除它们,然后在数组末尾补回相同数量的0。虽然直观,但并没有完全符合题意的"移动"。
cpp
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int zeroCount = 0;
// 从后向前删除0,并计数
for(int i = nums.size()-1; i >= 0; i--)
{
if(nums[i] == 0)
{
nums.erase(nums.begin() + i);
zeroCount++;
}
}
// 在末尾添加相同数量的0
nums.insert(nums.end(), zeroCount, 0);
}
};
这里需要注意的一点是:删除0的时候需要从后往前删 ,否则当我们删除 nums[i] 后,原先的 nums[i+1] 变成了 nums[i],会导致索引错位,跳过对新移动过来的元素的检查,从而可能漏删某些0。
2.双指针
这道题用双指针有一点杀鸡用牛刀的意思,不过这道题本身的目的也是为了让我们学习双指针,我下面给大家出了一个详细图解。
这里的"指针"其实并不是int*的类型。而是一个概念,用int类型的值表示数组下标。我们建立快慢指针,这里的快慢指针主要作用是将数组分块:

主播现在给大家以"5201020"这个数组举例,初始化状态下,快慢指针都指向首元素:

fast每次循环+1,如果Nums[fast]非0,slow自身加1:

非零,两指针都加1:

Nums[fast]为0时,slow不再自增,fast继续向前:

此时Num[fast]非0,交换二者的值,交换后slow+1:

fast继续向前:

继续向前

交换位置后,slow+1:

后面没有什么操作了,fast向后遍历,遍历完就结束了。
代码如下:
cpp
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int slow = 0;
for (int fast = 0; fast < nums.size(); fast++)
{
if (nums[fast] != 0)
{
swap(nums[slow], nums[fast]);
slow++;
}
}
}
};
学会了就给主播点个赞呗?(✪ω✪)
---------(如有问题,欢迎评论区提问)---------