目录
原题
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾 ,同时保持非零元素的相对顺序 。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1 :
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
题目解析
题目中给了我们一个数组 nums,要求我们将 nums 中的 0 都移动至数组的尾部 并且非 0 元素的相对位置要不变,比如示例 1,移动前, 1 在 3 之前,3 在 12 之前,将 0 移动到数组尾部后,1 仍然要在 3 之前,3 仍然要在 12 之前
算法原理
本题属于将数组分块的问题,我们要做的就是最终将数组分为两块,一块全是非 0 元素,一块全是 0 元素
为了达到这样的效果,我们可以定义两个指针(这里的指针是下标 ,并非真正意义上的指针),先用这两个指针将数组划分为三个部分 ,第一个部分 是已经处理好的元素 ,第二个部分 是待处理的 0 ,第三个部分 是待处理的非 0 元素 ,然后将待处理的 0 和待处理的 非 0 元素交换即可
设置两个指针 src 和 dest,src 指向被处理过的最后一个元素 ,dest 指向 0 元素,刚开始 src 为 -1,因为数组还未被处理过,dest 为 0,然后 dest 开始寻找非 0 元素,当 dest 找到非 0 元素时,src 指向的下一个就是 0 元素,将这两个交换,不断重复过程直到 dest 遍历完整个数组
代码实现
cpp
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int src = 0;
int dest = -1;
while (src < nums.size())
{
if (nums[src] != 0)
{
swap(nums[src], nums[++dest]);
}
src++;
}
}
};

