news 2026/8/6 11:20:49

LeetCode热题100——移动零

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode热题100——移动零

解法一:统计零 + erase/remove

💡 解题思路

这道题要求把数组中的所有0移到末尾,同时保持非零元素原来的相对顺序。

第一种方法可以分成三步:

  1. 遍历数组,统计一共有多少个0
  2. 使用remove()配合erase()删除数组中的所有0
  3. 根据统计出的数量,在数组末尾补回相同数量的0

例如:

原数组:[0, 1, 0, 3, 12] 零的数量:2 删除所有零:[1, 3, 12] 末尾补两个零:[1, 3, 12, 0, 0]

🧱 知识点卡片

🧹移动待保留元素

remove(nums.begin(), nums.end(), 0)会把所有非零元素向前移动,并返回新的“逻辑结尾”。

它不会真正缩短vector,末尾仍然保留着不再需要的元素,因此还要配合erase()

✂️真正删除尾部区间

erase(new_end, nums.end())会真正删除从新逻辑结尾到原数组末尾的元素。

把两步合在一起就是:

nums.erase(remove(nums.begin(), nums.end(), 0), nums.end());

在末尾添加元素

nums.push_back(0)会在vector的末尾添加一个0

循环执行count次,就能补回之前删除的所有零,同时保持数组长度不变。

💻 代码实现

class Solution { public: void moveZeroes(vector<int>& nums) { int count = 0; // 统计数组中零的数量 for (int i = 0; i < nums.size(); ++i) { if (nums[i] == 0) { count++; } } // remove 把非零元素向前移动 // erase 真正删除末尾不再需要的区间 nums.erase( remove(nums.begin(), nums.end(), 0), nums.end() ); // 在数组末尾补回相同数量的零 for (int i = 0; i < count; ++i) { nums.push_back(0); } } };

✅一句话总结:先数出零的数量,再删除所有零,最后把相同数量的零补到数组末尾。

解法二:双指针

💡 解题思路

使用两个位置:

  • i:从左到右扫描整个数组,寻找非零元素。
  • next:指向下一个非零元素应该放置的位置。

nums[i] != 0时,就交换nums[i]nums[next],然后把next向右移动一位。

[0, 1, 0, 3, 12]为例:

开始: [0, 1, 0, 3, 12] next = 0 遇到 1: [1, 0, 0, 3, 12] next = 1 遇到 3: [1, 3, 0, 0, 12] next = 2 遇到 12: [1, 3, 12, 0, 0] next = 3

每次发现非零元素,就把它放到前面的正确位置。扫描结束后,所有非零元素都保持原顺序排列在前面,零自然被交换到末尾。

🧱 知识点卡片

👉next 指针

next表示“下一个非零元素应该放在哪里”。

next左边都是已经处理好的非零元素;只有成功放入一个非零元素后,next才会加 1。

🔄swap()

swap(nums[i], nums[next])会交换当前位置和目标位置的元素。

如果i == next,相当于元素与自己交换,不会影响结果;因此代码不需要额外判断两个下标是否相同。

💻 代码实现

class Solution { public: void moveZeroes(vector<int>& nums) { // next 指向下一个非零元素应该放置的位置 int next = 0; // i 负责从左到右扫描整个数组 for (int i = 0; i < nums.size(); ++i) { if (nums[i] != 0) { // 把当前非零元素移动到前面的正确位置 swap(nums[i], nums[next]); // 下一个非零元素应该放到再右边一格 ++next; } } } };

✅一句话总结:用i寻找非零元素,用next标记它应该放置的位置;每找到一个非零元素就交换并移动next

🆚 方法对比

推荐使用双指针

解法一按照“统计、删除、补零”三个步骤完成,思路直观,也能保持非零元素的相对顺序。

解法二只需一次从左到右的扫描,通过交换原地完成移动,步骤更紧凑,也更符合这道题想考察的双指针思想。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/6 11:18:22

Oracle数据库Shared Pool与Buffer Cache内存优化实战

1. 问题现象与背景分析最近在排查一个Oracle数据库性能问题时&#xff0c;遇到了典型的"数据库卡死"现象&#xff1a;应用连接超时、SQL执行缓慢、甚至出现会话挂起。通过AWR报告分析发现&#xff0c;问题集中在Shared Pool和Buffer Cache的内存争用上。这种情况在OL…

作者头像 李华
网站建设 2026/8/6 11:18:16

手机直供电改造:解决移除电池后重启黑屏的硬件方案

1. 项目概述&#xff1a;手机直供电改造的“重启黑屏”困局 最近折腾了一个挺有意思的项目&#xff0c;也踩了不少坑&#xff0c;想和大家分享一下。核心就是标题里说的&#xff1a;给一部旧手机做直供电改造&#xff0c;拆掉内置电池&#xff0c;直接用外部的充电器或者充电宝…

作者头像 李华
网站建设 2026/8/6 11:17:52

MySQL数据库核心操作与优化实战指南

1. MySQL数据库操作基础与核心概念MySQL作为全球最流行的开源关系型数据库管理系统&#xff0c;其操作逻辑和设计理念直接影响着数百万开发者的日常工作。让我们从一个真实的开发场景开始&#xff1a;当你需要为一个电商平台设计用户数据存储方案时&#xff0c;第一反应可能就是…

作者头像 李华
网站建设 2026/8/6 11:17:47

MySQL事务ACID特性与InnoDB日志机制详解

1. 事务的本质与ACID特性解析在数据库系统中&#xff0c;事务&#xff08;Transaction&#xff09;是指作为单个逻辑工作单元执行的一系列操作。这些操作要么全部执行成功&#xff0c;要么全部不执行&#xff0c;不存在中间状态。MySQL通过ACID特性来保证事务的可靠性&#xff…

作者头像 李华
网站建设 2026/8/6 11:16:52

揭秘2024网站建设云尚网络如何通过匠心独运打造行业标杆品牌并赋能企业数字化转型

在这个信息爆炸的时代,我们每天醒来首先触碰的往往是手机屏幕,而在屏幕背后,连接着数以亿计的信息源,其中就包括了我们常说的企业官网。很多老板或者市场部门负责人在谈到“网站建设云尚网络”这个概念时,可能第一反应是:“不就是弄个网页吗?找个人搭个架子不就行了?”…

作者头像 李华
网站建设 2026/8/6 11:15:10

3分钟极速配置:告别GitHub网络延迟的终极加速方案

3分钟极速配置&#xff1a;告别GitHub网络延迟的终极加速方案 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 还在为GitHub的龟速下…

作者头像 李华