零的奇幻漂移:解密数组中的神秘消失与重生

news2024/9/25 23:11:57

在这里插入图片描述

本篇博客会讲解力扣“283. 移动零”的解题思路,这是题目链接。

在这里插入图片描述

思路1

这道题目很有意思。虽然是简单题,其蕴含的玄机还是很多的。正常来讲,这种题目一般都会原地操作(不开辟额外的数组,空间复杂度是O(1)),并且通过一次遍历来完成,这样效率是最高的。我拿到这道题的第一反应是,可以把前面的0都删了,然后后面再补0。具体来说:

  1. 使用2个下标,分别是fast和slow。
  2. fast负责在前面跑,寻找非0数,丢给slow,slow再往后走。

一开始slow是0,显然左边没有0。接着,slow一般不动,除非fast丢了个非0数给slow,slow才会往后走,此时slow左边也没有0。直到fast把数组遍历完,slow的左边都不会有0,且slow的左边就是原来数组的非0数,并且保持原来的顺序。最后从slow的位置开始,到数组末尾的数据全部都改成0即可。

void moveZeroes(int* nums, int numsSize) {
	int fast = 0;
	int slow = 0;
	// 把非0数搬运到左边,删除0
	for (fast = 0; fast < numsSize; ++fast)
	{
		if (nums[fast])
		{
			nums[slow++] = nums[fast];
		}
	}

	// 后面补0
	for (; slow < numsSize; ++slow)
	{
		nums[slow] = 0;
	}
}

在这里插入图片描述

思路2

思路1运用了较为取巧的思路,既然要把0扔到最后面,不如把非0数扔到前面(即删除0),后面再补0,这是一种覆盖的思路。

我们还可以从“交换”的角度来思考这个问题。还是双指针,分别是left和right。我们规定,left的左边没有0,left到right之间都是0。有没有发现,这和快速排序的单趟排序非常的像?在快速排序中,我们会选择一个key,在单趟排序后,保证key左边的值比key小,右边的值比key大,一个经典的思路就是,使用双指针left和right,每次交换后,都保证left左边的值比a[left]小,右边的值比a[left]大。当然,如果你没有联想到快速排序,也是可以解决这道题目的。我们可以这样思考:

  1. 一开始left和right都是0,满足left的左边没有0的条件。
  2. 接着,若right的值非0,则交换left和right,再让left和right向右移动,此时left的左边依然没有0。
  3. 如果right的值一直都非0,就会一直进行第2点的操作,从而left和right不会错开。
  4. 若right的值是0,则left不动,right向右移动,依然满足left的左边没有0的条件。
  5. right会遍历完整个数组,并且只遍历一遍,所以无论如何都要向右移动。
void moveZeroes(int* nums, int numsSize){
	int left = 0;
	int right = 0;
	while (right < numsSize)
	{
		// 保证left左边全是非0数
		if (nums[right])
		{
			// 交换左右下标
			int tmp = nums[left];
			nums[left] = nums[right];
			nums[right] = tmp;

			++left;
		}

		// 不管nums[right]是不是0,right都要向右移动
		++right;
	}
}

在这里插入图片描述

总结

移动0有两种思路:

  1. 把0直接覆盖删除,最后在数组的末尾补0。
  2. 使用单趟快排的思路,不断交换,把非0数换到左边,0换到右边。

感谢大家的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/805617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Debian12安装MySQL时报错缺少依赖libssl1.1(>= 1.1.1)

解决方案&#xff1a;进入镜像站&#xff0c;下载libssl包并安装&#xff0c;如&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/debian/pool/main/o/openssl/libssl1.1_1.1.1n-0%2Bdeb11u5_amd64.debIndex of /debian/pool/main/o/openssl/ | 清华大学开源软件镜像站 | Tsi…

用windeployqt.exe打包Qt代码

首先找到我们编译Qt代码的对应Qt版本的dll目录&#xff0c;该目录下有windeployqt.exe&#xff1a; D:\DevTools\Qt\5.9\msvc2017_64\bin 在这个目录下打开cmd程序。 然后把要打包的exe放到一个单独的目录下&#xff0c;比如&#xff1a; 然后在cmd中调用&#xff1a; winde…

【T1】存货成本异常、数量为零金额不为零的处理方法。

【问题描述】 使用T1飞跃专业版的过程中&#xff0c; 由于业务问题或者是操作问题&#xff0c; 经常会遇到某个商品成本异常不准确&#xff0c; 或者是遇到数量为0金额不为0的情况&#xff0c;需要将其成本调为0。 但是T1软件没有出入库调整单&#xff0c;并且结账无法针对数量…

光伏储能行业MES系统解决方案

万界星空科技光伏储能行业mes解决方案连接起仓储物流、生产计划、制程管理、品质管理等各个模块&#xff0c;覆盖全厂的各个工序段&#xff0c;提供计划的执行、跟踪以及所有资源(人、设备、物料等)的当前状态&#xff0c;帮助企业实现产品质量、生产效率的提升。 万界星空平台…

Unity射线穿透UI解决

unity场景中&#xff0c;射线是可以穿透UI的。我用过很多版本&#xff0c;都有这个问题。 比如我现在用2020版本的unity做了个范例&#xff1a; 我在场景中新建了一个cube名叫&#xff1a;我秦始皇打钱。 点击这个物体就会出现log显示这个物体的名字&#xff0c;代码在下面。…

<Java>Map<String,Object>中解析Object类型数据为数组格式

背景&#xff1a; 前端&#xff1a;入参为字符串和数组类型&#xff1b;通过json字符串传给后台&#xff0c; 后台&#xff1a;后台通过工具解析为Map<String&#xff0c;Object>&#xff0c;然后需要解析出Map里面的数组值做操作&#xff1b; 需求&#xff1a; 入参&…

常用的CSS渐变样式

边框渐变 方案1&#xff1a; 边框渐变( 支持圆角) width: 726px;height: 144px;border-radius: 24px;border: 5px solid transparent;background-clip: padding-box, border-box; background-origin: padding-box, border-box; background-image: linear-gradient(to right, #f…

SQL基础使用

SQL的概述 SQL全称&#xff1a; Structured Query Language&#xff0c;结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。 SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统SystemR上实现。 经过多年发…

百度文心一言接入教程-Java版

原文链接 前言 前段时间由于种种原因我的AI BOT网站停运了数天&#xff0c;后来申请了百度的文心一言和阿里的通义千问开放接口&#xff0c;文心一言的接口很快就通过了&#xff0c;但是文心一言至今杳无音讯。文心一言通过审之后&#xff0c;很快将AI BOT的AI能力接入了文心…

Ansible单yaml文件部署Zabbix5.0监控平台

文章目录 Ansible单yaml文件部署Zabbix5.0监控平台节点规划案例实施基础环境准备编写剧本文件ZabbixWeb界面(1)改中文(2)添加监控主机 Ansible单yaml文件部署Zabbix5.0监控平台 节点规划 IP主机名节点192.168.200.10ansibleAnsible节点192.168.200.20zabbix-serverZabbix-ser…

5、Kubernetes核心技术 - Controller控制器工作负载

目录 一、Deployments - 控制器应用 二、Deployment升级回滚和弹性收缩 2.1、创建一个 1.14 版本的 pod 2.2、应用升级 2.3、查看升级状态 2.4、查看历史版本 2.5、应用回滚 2.6、弹性伸缩 三、StatefulSet - 有状态应用 四、DaemonSet - 守护进程 五、Job - 单次任…

使用低代码开发,需要注意哪些?

低代码平台的历史相对较短&#xff0c;大约始于 2000 年初&#xff0c;源于快速应用程序开发工具。随着低代码平台和工具的日益普及和优势&#xff0c;它不断发展以满足各种领域和角色的需求。 本文将研究各种低代码和无代码应用程序开发方法、业务用例、挑战和未来预测等。 一…

2022前端开发实习总结报告

2022前端开发实习总结报告1 一、顶岗实习目的 根据所学课程的理论知识&#xff0c;结合企业的运营实际&#xff0c;掌握软件开发的一般过程&#xff0c;软件的生命周期和作为一个开发人员就应具备的基本潜力&#xff0c;并撰写顶岗实习报告。使学生进一步巩固所学理论知识&am…

判断是否是二叉对称树(两种方法:递归+迭代)

给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 源代码如下&#xff1a; //递归 class Solution { public:bool dfs(TreeNode* p,TreeNode* q){if(pnullptr && qnullptr) return true;//同…

redis的如何使用

1、redis的使用 1.1windows安装 安装包下载地址&#xff1a;Releases dmajkic/redis GitHub 1.2 redis中常使用的几个文件 1.3 redis中运行 双击redis-server&#xff0c;既可以运行。 1.4使用redis客户单来连接redis 1.5redis的常用指标 redis-serve 服务端,端口号&am…

【嵌入式学习笔记】嵌入式基础10——STM32时钟配置

1.认识时钟树 简单来说&#xff0c;时钟是具有周期性的脉冲信号&#xff0c;最常用的是占空比50%的方波 1.1.F1的时钟树 1.2.F4的时钟树(407为例) 1.3.F7的时钟树 1.4.H7的时钟树 2.配置系统时钟(F1为例) 2.1.系统时钟配置步骤 配置HSE VALUE&#xff1a;告诉HAL库外部晶振…

软件测试技能大赛任务二单元测试试题

任务二 单元测试 执行代码测试 本部分按照要求&#xff0c;执行单元测试&#xff0c;编写java应用程序&#xff0c;按照要求的覆盖方法设计测试数据&#xff0c;使用JUnit框架编写测试类对程序代码进行测试&#xff0c;对测试执行结果进行截图&#xff0c;将相关代码和相关截…

浅谈深度神经网络

Deep neural networks are completely flexible by design, and there really are no fixed rules when it comes to model architecture. -- David Foster 前言 神经网络 (neural network) 受到人脑的启发&#xff0c;可模仿生物神经元相互传递信号。神经网络就是由神经元组成…

JMeter 怎么查看 TPS 数据教程,简单易懂

TPS 是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时&#xff0c;收到服务器响应后结束计时&#xff0c;以此来计算使用的时间和完成的事务个数。在 JMeter 中&#xff0c;我们可以使用以下方法查看 T…

1300*C. Slay the Dragon

Example input 4 3 6 2 3 5 3 12 7 9 4 14 1 10 8 7 output 1 2 4 0 2 解析&#xff1a; 题意是选一个人去攻击龙&#xff0c;其余人防守龙&#xff0c;可以花费 x 块钱让某英雄能力 x&#xff0c;问最少的花费是多少。 贪心&#xff0c;选择大于龙的防御力并且最小的那个英…