LeetCode 283. 移动零

目录

原题

移动零

给定一个数组 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++;
        }
    }
};
相关推荐
叫我辉哥e117 小时前
### 技术文章大纲:C语言造轮子大赛
c语言·开发语言
guygg8818 小时前
NOMA功率分配与64 QAM调制中的SIC的MATLAB仿真
开发语言·matlab
TracyCoder12318 小时前
LeetCode Hot100(15/100)——54. 螺旋矩阵
算法·leetcode·矩阵
flushmeteor19 小时前
JDK源码-基础类-String
java·开发语言
u01092727120 小时前
C++中的策略模式变体
开发语言·c++·算法
2501_9418372620 小时前
停车场车辆检测与识别系统-YOLOv26算法改进与应用分析
算法·yolo
雨季66620 小时前
构建 OpenHarmony 简易文字行数统计器:用字符串分割实现纯文本结构感知
开发语言·前端·javascript·flutter·ui·dart
雨季66620 小时前
Flutter 三端应用实战:OpenHarmony 简易倒序文本查看器开发指南
开发语言·javascript·flutter·ui
进击的小头21 小时前
行为型模式:策略模式的C语言实战指南
c语言·开发语言·策略模式
Aevget21 小时前
MFC扩展库BCGControlBar Pro v37.2新版亮点:控件功能进一步升级
c++·mfc·界面控件