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++;
        }
    }
};
相关推荐
啊森要自信5 小时前
CANN ops-cv:AI 硬件端视觉算法推理训练的算子性能调优与实战应用详解
人工智能·算法·cann
玄同7656 小时前
从 0 到 1:用 Python 开发 MCP 工具,让 AI 智能体拥有 “超能力”
开发语言·人工智能·python·agent·ai编程·mcp·trae
czy87874756 小时前
深入了解 C++ 中的 `std::bind` 函数
开发语言·c++
消失的旧时光-19436 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
yq1982043011566 小时前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class6 小时前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
Jinkxs6 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&6 小时前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin
我在人间贩卖青春6 小时前
C++之继承的方式
c++·private·public·protected·继承方式
仟濹6 小时前
算法打卡day2 (2026-02-07 周五) | 算法: DFS | 3_卡码网99_计数孤岛_DFS
算法·深度优先