首页/新闻资讯/正文详情

LeetCode 283.移动零:双指针原地算法详解与应用

发布时间:2026/11/3 3:58:39 来源:云帆数科 栏目:资讯中心
LeetCode 283.移动零:双指针原地算法详解与应用
1. 问题背景与核心需求283.移动零是LeetCode热题100中的经典数组操作题目也是硅谷大厂面试高频考题。题目要求将给定数组中的所有0移动到末尾同时保持非零元素的相对顺序。看似简单的需求背后考察的是对数组遍历、双指针技巧和原地算法in-place algorithm的掌握程度。这道题在2023年LeetCode周赛中出现过变种比如要求移动特定值而非零或者需要在移动后统计操作次数。实际工程中类似场景也很多比如数据库记录整理、日志文件处理等需要保持元素顺序的过滤操作。2. 解法思路分析与比较2.1 暴力解法与空间优化最直观的解法是新建一个等长数组先放入非零元素再补零。但这样空间复杂度是O(n)不符合常要求的原地操作。面试时提出这种解法通常会被要求优化。def moveZeroes_naive(nums): new_nums [x for x in nums if x ! 0] new_nums [0] * (len(nums) - len(new_nums)) return new_nums2.2 双指针标准解法标准解法使用快慢双指针慢指针slow始终指向下一个非零元素要放入的位置快指针fast遍历寻找非零元素def moveZeroes(nums): slow 0 for fast in range(len(nums)): if nums[fast] ! 0: nums[slow], nums[fast] nums[fast], nums[slow] slow 1关键点当快指针遇到非零元素时与慢指针位置交换。这样能保证非零元素的相对顺序不变所有零被挤到数组末尾只需一次遍历时间复杂度O(n)2.3 变种解法雪球效应另一种思路是把零想象成雪球遇到非零元素时就将其滚到前面def moveZeroes_snowball(nums): snowball_size 0 for i in range(len(nums)): if nums[i] 0: snowball_size 1 elif snowball_size 0: nums[i - snowball_size] nums[i] nums[i] 03. 边界条件与异常处理实际编码时需要特别注意空数组输入全零数组全非零数组超大数组LeetCode测试用例可达10^4量级# 完整版带边界检查 def moveZeroes_robust(nums): if not nums or len(nums) 1: return slow 0 for fast in range(len(nums)): if nums[fast] ! 0: if fast ! slow: # 避免不必要的自交换 nums[slow], nums[fast] nums[fast], nums[slow] slow 14. 复杂度分析与优化证明时间复杂度所有解法都是单次遍历O(n)交换操作次数 非零元素个数空间复杂度标准解法只使用常数额外空间O(1)优化证明任何解法至少需要O(n)时间必须检查每个元素原地操作最优空间是O(1)因此双指针解法已达到理论最优5. 实际工程应用场景日志处理将ERROR日志移到文件末尾方便批量查看# 日志级别DEBUG0, INFO1, WARN2, ERROR3 logs [1, 3, 1, 0, 2, 0, 0, 3] moveZeroes(logs) # 将DEBUG日志(0)移到最后数据清洗将无效数据用0表示集中处理sensor_data [23.5, 0, 42.1, 0, 0, 18.9] moveZeroes(sensor_data) # 无效读数归并内存优化稀疏数组压缩后需要恢复结构6. 常见面试问题与回答策略Q: 如果要求移动的是特定值而非零如何修改 A: 只需将判断条件nums[fast] ! 0改为nums[fast] ! targetQ: 如何统计移动操作的次数 A: 添加计数器每次交换时递增count 0 for fast in range(len(nums)): if nums[fast] ! 0: if fast ! slow: nums[slow], nums[fast] nums[fast], nums[slow] count 1 slow 1 return countQ: 如果要求保持零的相对顺序呢 A: 需要使用稳定排序算法复杂度会升至O(nlogn)7. 测试用例设计技巧完整测试应包含test_cases [ ([], []), # 空数组 ([0], [0]), # 单元素 ([1,2,3], [1,2,3]), # 无零数组 ([0,0,0], [0,0,0]), # 全零数组 ([1,0,2,0,3], [1,2,3,0,0]), # 标准案例 ([0,1,0,3,12], [1,3,12,0,0]), # LeetCode示例 ([1]*10000 [0]*10000, [1]*10000 [0]*10000) # 大数据量 ]8. 同类题目拓展练习27.移除元素移除特定值26.删除有序数组中的重复项80.删除有序数组中的重复项II75.颜色分类荷兰国旗问题这些题目都使用类似的双指针技巧区别在于指针移动条件和元素处理逻辑。建议按这个顺序练习逐步提升对双指针法的理解深度。

相关推荐

ISO 16750-3振动试验中文译稿:谱表、温度循环与台架避坑
ISO 16750-3振动试验中文译稿:谱表、温度循环与台架避坑

简介:这份PDF格式的标准文本对应ISO 16750-3:2003《道路车辆—电气和电子装备的环境条件和试验 第3部分:机械环境》,面向汽车电子系统与组件的设计、验证及测试人员,用于厘清车载电气电子装备在机械应力下的试验要求与判定思路。压… · 2026/11/3 3:58:39

施乐7835扫描器故障诊断与维修指南
施乐7835扫描器故障诊断与维修指南

1. 施乐7835扫描器故障现象解析施乐7835作为一款经典的中高速数码复合机,扫描模块故障是维修工单中的高频问题。当设备开机时出现"扫描器故障"提示(英文显示为"Scanner Error"),通常伴随以下典型症状&#xf… · 2026/11/3 3:58:39

Step 5 Preview、DeepSeek V4 Pro、GLM5.3 三模型实测:从零开发3D游戏谁更强
Step 5 Preview、DeepSeek V4 Pro、GLM5.3 三模型实测:从零开发3D游戏谁更强

1. 三款模型同台竞技:这场3D游戏实测到底在测什么最近圈子里讨论度最高的一件事,就是拿 Step 5 Preview、DeepSeek V4 Pro 和 GLM5.3 这三个模型,让它们分别从零开始做一个 3D 游戏。我花了整整两天时间,把这三个模型都跑了一遍同… · 2026/11/3 3:58:39

NineData实现MySQL到openGauss PostgreSQL数据复制
NineData实现MySQL到openGauss PostgreSQL数据复制

1. 项目概述:NineData新增MySQL到openGauss PostgreSQL兼容版数据复制链路最近NineData平台上线了一个让数据库管理员们眼前一亮的新功能——支持MySQL到openGauss PostgreSQL兼容版的数据复制链路。这个功能解决了不少企业级用户在实际业务中遇到的数据库迁移难题。… · 2026/11/3 4:33:49

医院医疗设备管理系统微信小程序开发实践
医院医疗设备管理系统微信小程序开发实践

1. 项目概述这个医院医疗设备管理系统微信小程序毕设项目,是我去年指导计算机专业学生完成的典型毕业设计案例。整套系统包含完整的前后端代码、数据库设计文档和技术说明文档,实现了医疗设备的全生命周期管理。从实际运行效果来看,系统日均能… · 2026/11/3 4:33:49

代码注入与Hook技术:原理、实现与应用解析
代码注入与Hook技术:原理、实现与应用解析

1. 代码注入与Hook技术核心概念解析在软件开发和安全研究领域,代码注入和Hook技术就像外科医生的手术刀——用得好可以治病救人,用不好则会造成严重伤害。这两种技术本质上都是通过干预程序正常执行流程来实现特定功能,但它们的实现原理和应用… · 2026/11/3 4:33:49

蒙特卡洛模拟从原理到实战:工期、库存与风险估算
蒙特卡洛模拟从原理到实战:工期、库存与风险估算

上周某位做项目管理的朋友问了我一个问题:手上这个研发项目,合同里写死了六个月交付,可每个环节的工期都是估出来的,有的乐观有的悲观,最后按期完成的概率到底有多大?他手上有一张 Excel 表,每个… · 2026/11/3 4:33:49

8cm等于多少像素?厘清PPI、CSS像素与印刷分辨率的换算逻辑
8cm等于多少像素?厘清PPI、CSS像素与印刷分辨率的换算逻辑

做设计、写前端、跑印刷的人,几乎都被同一个问题绊过一下:8cm等于多少像素。这个问题看着像小学算术,实际上一句话根本答不完。我在带新人的时候,最常听到的两句抱怨,一句是"我按8cm做的图,打印出来矮… · 2026/11/3 4:33:49

V2X技术实现卡车自动编队行驶:原理与应用
V2X技术实现卡车自动编队行驶:原理与应用

1. 项目概述:当卡车在高速上自动排成"火车"去年夏天,我在G15沈海高速上看到一列特殊的"货运火车"——五辆重型卡车以不到10米的间距匀速行驶,头车司机偶尔调整方向盘,后车就像被无形绳索牵引般同步跟随。这正… · 2026/11/3 4:32:49

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码