L28.【LeetCode笔记】移动零(三种解法)
目录
1.题目
2.向前覆盖法
分析
代码
提交结果
3.优解:双指针
代码
提交结果
4.其他不符合题意的方法:使用队列
代码
提交结果
1.题目
https://leetcode.cn/problems/move-zeroes/description/
给定一个数组
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进阶:你能尽量减少完成的操作次数吗?
2.向前覆盖法
分析
设一指针ptr,从头到尾遍历数组,发现num[ptr]==0时,执行向前覆盖,尾部填充一个0,但如果只这样写会有问题!
例如测试数据[0,0,1,0]

移动一次后发现1前面的元素nums[ptr-1]==0,即没有完全移动好1,那么这种情况出现时ptr要--
写成下面这样可以吗?
if (nums[ptr-1]==0)ptr--;
不行会有潜在的越界风险! ptr-1可能会<0,因此要写成
if (ptr>=1&&nums[ptr-1]==0)ptr--;
代码
void moveZeroes(int* nums, int numsSize)
{int ptr=0;while(ptr<=numsSize-1){if (ptr>=1&&nums[ptr-1]==0)ptr--;if (0==nums[ptr]){ for (int i=ptr;i<numsSize-1;i++){nums[i]=nums[i+1];}nums[numsSize-1]=0;numsSize--;} ptr++;}
}
提交结果

3.优解:双指针
LeetCode官方题解的双指针有点不好理解,其实可以直接分类讨论指针所指向的值:设两个指针prev和cur,当初始prev==0,cur==1时(先排除数组元素只有一个的情况),它们指向元素的情况无非就四种
1.nums[prev]==0,nums[cur]==0
2.nums[prev]!=0,nums[cur]==0
3.nums[prev]!=0,nums[cur]!=0
4.nums[prev]==0,nums[cur]!=0
首先看4:这种情况最好处理,nums[prev]交换nums[cur]就能将0向后移动
剩下情况1,情况2,情况3都要遵循一个原则:想方设法转换为情况4
情况1:nums[prev]==0,nums[cur]==0 --转换--> nums[prev]==0,nums[cur]!=0 :cur++寻找nums[cur]!=0
情况2:nums[prev]!=0,nums[cur]==0 --转换--> nums[prev]==0,nums[cur]!=0 :prev和cur都++
情况3:nums[prev]!=0,nums[cur]!=0 --转换--> nums[prev]==0,nums[cur]!=0 :附近没有0,prev和cur都++
代码
void moveZeroes(int* nums, int numsSize)
{if(numsSize==1)return;int prev=0;int cur=1;while (cur<numsSize){if (nums[prev]==0&&nums[cur]!=0){int tmp=nums[prev];nums[prev]=nums[cur];nums[cur]=tmp;}if (nums[prev]!=0&&nums[cur]!=0){prev++;}if (nums[prev]!=0&&nums[cur]==0){prev++;}cur++;}
}
提交结果

4.其他不符合题意的方法:使用队列
虽然使用队列并没有原地对数组操作,但可以锻炼对队列的使用(其实直接开辟一个临时数组就行)
思想:将非0数字依次入队,遍历完一遍数组后再依次出队,原数组末尾补0
有关队列的文章参见:98.【C语言】数据结构之队列
代码
typedef int QDataType;typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;int size;
}Queue;void QueueInit(Queue* pq)
{pq->head = pq->tail = NULL;pq->size = 0;
}void QueueDestroy(Queue* pq)
{QNode* cur = pq->head;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->head = pq->tail = NULL;pq->size = 0;
}void QueuePush(Queue* pq, QDataType x)
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc");return;}newnode->data = x;newnode->next = NULL;if (pq->head == NULL){assert(pq->tail == NULL);pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;
}void QueuePop(Queue* pq)
{QNode* next = pq->head->next;free(pq->head);pq->head = next;if (pq->head == NULL)pq->tail = NULL;pq->size--;
}bool QueueEmpty(Queue* pq)
{return pq->size == 0;
}QDataType QueueFront(Queue* pq)
{return pq->head->data;
}void moveZeroes(int* nums, int numsSize)
{Queue q;QueueInit(&q);for (int i=0;i<numsSize;i++){if (nums[i]!=0){QueuePush(&q,nums[i]);}}int j=0;while(!QueueEmpty(&q)){nums[j]=QueueFront(&q);QueuePop(&q);j++;}for (;j<numsSize;j++){nums[j]=0;}QueueDestroy(&q);
}
提交结果

相关文章:
L28.【LeetCode笔记】移动零(三种解法)
目录 1.题目 2.向前覆盖法 分析 代码 提交结果 3.优解:双指针 代码 提交结果 4.其他不符合题意的方法:使用队列 代码 提交结果 1.题目 https://leetcode.cn/problems/move-zeroes/description/ 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾…...
jenkins入门10--自动化构建
build periodically:设定类似cron周期性时间触发构建 * * * * * (五颗星,中间用空格隔开) 第一颗表示分钟,取值0~59 第二颗表示小时,取值0~23 第三颗表示一个月的第几天,取值1~31 第四颗表示第几月…...
el-table拖拽表格
1、拖拽插件安装 npm i -S vuedraggable // vuedraggable依赖Sortable.js,我们可以直接引入Sortable使用Sortable的特性。 // vuedraggable是Sortable的一种加强,实现组件化的思想,可以结合Vue,使用起来更方便。 2、引入拖拽函数…...
如何轻松反转C# List<T>中的元素顺序
在C#中,有多种方法可以反转 List<T> 的元素顺序。以下是几种常见的方法: 方法一:使用 List<T>.Reverse 方法 List<T> 类提供了一个内置的 Reverse 方法,可以就地反转列表中的元素顺序。 using System; using…...
Transformer中Self-Attention以及Multi-Head Attention模块详解(附pytorch实现)
写在前面 最近在项目中需要使用Transformer模型来处理图像任务,所以稍微补充一下这部分的知识,本篇主要了解一下Self-Attention以及Multi-Head Attention模块。 原论文链接:https://arxiv.org/pdf/1706.03762 原文代码:tensor2…...
在Nvidia Jetson ADX Orin中使用TensorRT-LLM运行llama3-8b
目录 背景:步骤 1.获取模型权重第 2 步:准备第 3 步:构建 TensorRT-LLM 引擎 背景: 大型语言模型 (LLM) 推理的关键瓶颈在于 GPU 内存资源短缺。因此,各种加速框架主要强调减少峰值 GPU 内存使…...
六十一:HTTP/2的问题及HTTP/3的意义
随着互联网的快速发展,网络协议的升级成为优化用户体验和提升网络效率的重要手段。HTTP/2 于 2015 年发布,标志着超文本传输协议的重大改进。然而,尽管 HTTP/2 带来了许多新特性,它也存在一定的问题。在此背景下,HTTP/…...
IOS开发如何从入门进阶到高级
针对iOS开发的学习,不同阶段应采取不同的学习方式,以实现高效提升.本文将iOS开发的学习分为入门、实战、进阶三个阶段,下面分别详细介绍. 一、学习社区 iOS开源中国社区 这个社区专注于iOS开发的开源项目分享与协作,汇集了大量开…...
非一般的小数:小数的概念新解、小数分类、浮点数的存储
非一般的小数:小数的概念新解、小数分类、浮点数的存储 一、小数的概念二、小数的分类1.有限小数、无限循环小数、无限不循环小数2.纯小数、带小数3.定点数、浮点数 三、浮点数的存储 一、小数的概念 这还用解释吗?小…...
关于游戏销量的思考
1、黑神话达到2300万套,分析师上调预期到超过100亿营收。 以往的我的世界、小鸟、超级食肉男孩等游戏也都是几千万,上亿的销量。 也改变了相关开发者的命运。 一个开发者,卖出一个30万,或100万销量的作品,就足够改变…...
JuiceFS 详解:一款为云原生设计的高性能分布式文件系统
JuiceFS 详解:一款为云原生设计的高性能分布式文件系统 1. 什么是 JuiceFS? JuiceFS(Juiced File System)是一款高性能、POSIX 兼容的云原生分布式文件系统。它采用对象存储作为底层存储,支持多种元数据引擎…...
百度Android面试题及参考答案 (下)
Executorservice 和 Executor 有什么区别? Executor 接口 Executor 是一个简单的接口,它定义了一个方法execute(Runnable command)。这个接口的主要目的是将任务的提交和任务的执行分离,它提供了一种通用的方式来执行一个Runnable任务,但是它没有提供更多高级的功能,比如任…...
RK3588+FPGA全国产异步LED显示屏控制卡/屏幕拼接解决方案
RK3588FPGA核心板采用Rockchip RK3588新一代旗舰 级八核64位处理器,支持8K视频编解码,多屏4K输出,可实现12屏联屏拼接、同显、异显,适配多种操作系统,广泛适用于展览展示、广告内容投放、新零售、商超等领域实现各种媒…...
Elasticsearch:Query rules 疑难解答
作者:来自 Elastic Kathleen_DeRusso 查询规则(Query rules)为用户提供了一种对特定查询进行细粒度控制的方法。目前,查询规则的功能允许你将你选择的搜索结果固定在结果集的顶部,和/或根据上下文查询数据从结果集中排…...
四、VSCODE 使用GIT插件
VSCODE 使用GIT插件 一下载git插件与git Graph插件二、git插件使用三、文件提交到远程仓库四、git Graph插件 一下载git插件与git Graph插件 二、git插件使用 git插件一般VSCode自带了git,就是左边栏目的图标 在下载git软件后vscode的git插件会自动识别当前项目 …...
键盘鼠标共享工具Barrier(kail与windows操作系统)
键鼠共享工具Barrier(kail与windows操作系统)_barrier软件-CSDN博客 sudo apt install barrier...
QTcpSocket 中设置接收缓冲区大小
在 QTcpSocket 中设置接收缓冲区大小 使用setSocketOption方法 在QTcpSocket类中,可以使用setSocketOption函数来设置接收缓冲区大小。具体来说,对于 TCP 套接字,你可以使用QAbstractSocket::ReceiveBufferSizeSocketOption选项。以下是一个简…...
Arduino IDE刷微控制器并下载对应固件的原由
在使用Arduino IDE刷写某个微控制器时,下载对应的固件通常是为了确保微控制器能够正确识别和执行Arduino IDE中编写的代码。以下是对这一过程的详细解释: 一、固件的作用 固件是微控制器或嵌入式设备上运行的软件,它负责控制硬件设备的操作…...
Jurgen提出的Highway Networks:LSTM时间维方法应用到深度维
Jurgen提出的Highway Networks:LSTM时间维方法应用到深度维 具体实例与推演 假设我们有一个离散型随机变量 X X X,它表示掷一枚骰子得到的点数,求 X X X 的期望。 步骤: 列出 X X X 的所有可能取值 x i x_i xi(…...
Netron可视化深度学习的模型框架,大大降低了大模型的学习门槛
深度学习是机器学习的一个子领域,灵感来源于人脑的神经网络。深度学习通过多层神经网络自动提取数据中的高级特征,能够处理复杂和大量的数据,尤其在图像、语音、自然语言处理等任务中表现出色。常见的深度学习模型: 卷积神经网络…...
企业级OpenClaw集中部署安全架构避坑全攻略
只需1小时全链路加固,让OpenClaw稳定上线、合规无忧 在一次大型制造业项目中,某金融客户耗时三个月完成OpenClaw功能对接,却因忽略安全配置,半天内被黑客扫光知识库、篡改AI流程,直接触发合规问责。你是否也担心“一装…...
如何快速修复损坏的MP4视频:终极免费工具指南
如何快速修复损坏的MP4视频:终极免费工具指南 【免费下载链接】untrunc Restore a truncated mp4/mov. Improved version of ponchio/untrunc 项目地址: https://gitcode.com/gh_mirrors/un/untrunc 你是否曾经历过这样的绝望时刻?精心拍摄的家庭…...
第5篇 | SOA实践启示录:从信号到服务,AUTOSAR的架构跃迁
2025年底,L2级辅助驾驶渗透率已接近60%,汽车正从“功能堆叠”走向“服务化”。AUTOSAR Adaptive平台是这场变革的技术底座。 SOME/IP服务接口详解 SOME/IP将服务接口分为三类: Method:请求-响应式操作(如SetTargetTe…...
RecursiveCharacterTextSplitter类解读
基于 LangChain 当前官方文档与官方源码/参考入口,RecursiveCharacterTextSplitter 可以这样理解: 文章目录1) 切分原理2) 关键参数3) 方法接口4) 适用边界5) 中文场景优化6)核心类方法的使用1. split_text(text: str) -> list[str]2. cre…...
PoeCharm实战指南:5步打造你的流放之路完美BD构建
PoeCharm实战指南:5步打造你的流放之路完美BD构建 【免费下载链接】PoeCharm Path of Building Chinese version 项目地址: https://gitcode.com/gh_mirrors/po/PoeCharm 还在为《流放之路》复杂的BD构建而头疼吗?PoeCharm作为一款专为中文玩家打…...
基于 SpringBoot 的生活信息分享平台,从 0 到 1 完整实现(附源码 + 数据库)
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
ComfyUI-Manager中SVD模型加载错误的深度解析与高效解决实战指南
ComfyUI-Manager中SVD模型加载错误的深度解析与高效解决实战指南 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various custom…...
数据库知识复习03
第三部分 MySQL DQL 数据查询语言1 数据库的 DQL(数据查询语言)DQL(Data Query Language,数据查询语言)是 SQL 中最核心、使用频率最高的语言类型,核心关键字为 SELECT,用于从数据库表中精准检索…...
别再为Matlab和Unity联调发愁了!手把手教你用UDP搞定实时数据通信(附完整C#/M代码)
跨平台实时通信实战:用UDP打通Matlab与Unity的数据通道 在机器人仿真和数字孪生项目中,Matlab强大的算法开发能力与Unity出色的可视化表现常常需要协同工作。但两个平台间的数据交换却让不少开发者头疼——TCP协议虽然可靠,但在实时性要求高的…...
Qt程序在RK3588上报错?一文搞懂defaultServiceProvider::requestService()的底层原理与修复
QtMultimedia在RK3588上报错深度解析:从插件机制到GStreamer集成实战 当我们将精心开发的Qt多媒体应用部署到RK3588开发板时,defaultServiceProvider::requestService(): no service found for "org.qt-project.qt.mediaplayer"这个看似简单的…...
