Leetcode刷题详解——移动零

题目链接: 移动零

题目描述:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = 0,1,0,3,12 输出: 1,3,12,0,0 示例 2:

输入: nums = 0 输出: 0

提示:

1 <= nums.length <= 104

-231 <= nums[i] <= 231 - 1

进阶:你能尽量减少完成的操作次数吗?

解题思路:

  1. 用一个cur指针扫描整个数组,dest指针记录非零数序的最后一个位置,

  2. [0,dest]全部元素都是保持相对顺序的非零元素,[dest+1,cur-1]全部元素都是0

算法流程:

  1. 初始化cur=0(用来遍历数组),dest=-1(指向非零元素序列的最后一个位置)

  2. cur依次往后遍历每个元素,遍历到的元素会有以下两种情况:

    • ​ 遇到的元素是0,cur++

    • ​ 遇到的元素不是0,dest++,并且交换cur位置和dest位置的元素,之后cur++,扫描下一个元素

      • 因为dest指向的位置是非零元素区间的最后一个位置,如果扫描到一个新的非零元素,那么它的位置应该在dest+1的位置上,因此dest先自增1

      • dest++之后,指向的元素就是0元素(因为非零元素区间末尾的后一个元素就是0),因次可以交换到cur所处的位置,实现[0,dest]的元素全部都是非零元元素,[dest+1,cur-1]的元素全是0

算法流程图:

c++版本代码

c 复制代码
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int dest=-1;
        for(int cur=0;cur<nums.size();cur++)
        {
            if(nums[cur])
            {
               swap(nums[++dest],nums[cur]);
            }
        }
    }
};

C语言版本代码

c 复制代码
void swap(int *n1,int *n2)
{
    int temp=*n1;
    *n1=*n2;
    *n2=temp;
}
void moveZeroes(int* nums, int numsSize){
    int cur=0;
    int dest=-1;
    while(cur<numsSize)
    {
        if(nums[cur])
        {
            dest++;
            swap(&nums[dest],&nums[cur]);
        }
        cur++;
    }
}
相关推荐
(╹◡╹)4 小时前
18.剪枝
算法·机器学习·剪枝
Fa_Mian_Tuan5 小时前
图论基础|邻接矩阵超详细讲解(含无向/有向/带权图+完整可运行C语言代码)
c语言·数据结构·笔记·算法·图论
hanhahai5 小时前
指针与函数(函数指针与指针函数)
算法
码匠许师傅5 小时前
【C++ 面试真题】聊聊 C++ 的序列容器
java·c++·面试
ValhallaCoder5 小时前
Leetcode-hot100(2026.08.17)
python·算法·leetcode
C++ 老炮儿的技术栈5 小时前
Qt5.9.1 Windows 完整开发环境搭建流程
开发语言·c++·windows·qt·编辑器·代码化
泡沫冰@6 小时前
GO 语言基础
开发语言·算法·golang
键盘会跳舞6 小时前
C++:std::tuple 源码级深度拆解——变参模板、SFINAE与模板元编程核心技巧
开发语言·c++·sfinae·变参模板
bkspiderx6 小时前
从零开始:VS Code搭建C/C++开发环境全指南(Windows/macOS/Linux)
c语言·c++·windows·vs code·c/c++开发环境
东华万里6 小时前
第40篇C++核心基础与工程实践:从底层逻辑到避坑指南
开发语言·c++·面试·大学生专区