力扣刷题第1天:消失的数字

news2024/12/23 14:14:24

      大家好啊,从今天开始将会和大家一起刷题,从今天开始小生也会开辟新的专栏。😜😜😜

目录

第一部分:题目描述

第二部分:题目分析

第三部分:解决方法

3.1 思路一:先排序再查找

3.2 思路二:公式运算

3.3 思路三:异或运算

第四部分:代码实现

第五部分:总结收获


第一部分:题目描述

第二部分:题目分析

    由图片分析可得,该题目对算法时间复杂度有一定的要求时间复杂度为O(N),这是关键所在,也就是说只能遍历一遍数组,便可以找到缺失的那个数字。

第三部分:解决方法

3.1 思路一:先排序再查找

     既然是0~n内的整数,且仅仅缺少了一个整数,那么我们就可以先对该数组进行排序,再检验相邻下标的元素是否相差为1,理论上便可以得出最后的结果。但是不得不提醒大家,排序的复杂度是相当高的,即便是最复杂度最小的快排,在这个程序内也不合适。我们可以通过图片来认识。

      由该表可知,当我们使用效率最高的排序且考虑最坏的情况时,复杂度为N*log(N),显然在这个题目中超出了复杂度的要求,因此,这种思路虽然是最直接的但是一定会超时。别慌,我们再想想其他办法。

3.2 思路二:公式运算

      具体问题具体分析,0-n它是一个等差数列,既然我们该数组存储的是0~n里面的整数且只缺少了一个整数,那我们可以用将0 ~ n所有的整数相加,再把该数组中的整数元素相加,最后把这两个相加后的结果相减,便会得到消失的那个数字,直接返回即可。

       但是我们可以举一反三,如果题目更改一下,缺失的并非一个数字而是多个数字呢?那这种方法是不是就不起作用啦?这种方法还是不错的,那有没有更加普适性的方法呢?大家可以思考一下。

3.3 思路三:异或运算

       异或运算是属于位运算的一种,它是按照位置进行运算的,位与位异或,相同为0,不相同为1,同时,位运算(按位与、按位或、按位异或)是满足交换律和结合律的,因此,位运算它是没有顺序之分的,改变数的运算顺序,并不会改变最后的结果。

        在这道题中,解题的思路在于:两个相同的数异或结果一定是0,0和任何数异或是它本身,因此,我们只需要定义一个初始化为0的变量,依次与该数组每个数字异或,然后和0~n的每一个数字再进行异或,最后留下来的便是所求的数字了。(双爆胎数字异或结果为0,再与其他数异或,并不会改变这个数,最后只剩下单独出现的那个数字,也就是缺失的数字。)

第四部分:代码实现

方法一代码详解:定义两个变量,一个通过循环存储0~n所有数字的和,一个通过循环存储数组所有元素的和,最后相减即可。

     注意这里的numSize是数组中的整数的最大取值也就是n, 同时也是数组中的元素个数(数组长度),是通过参数传递的方式进来的。

时间复杂度:O(n)
空间复杂度:O(1)

int Missingnum(int* nums, int numsSize)
{
	int sum1 = 0;
	int sum2 = 0;

   //1.求出0~n所有元素之和
	for (int i = 0; i < numsSize + 1; i++)
	{
		sum1 =sum1+ i;
	}

	//2.求出数组所有元素之和
	for (int j = 0; j < numsSize; j++)
	{
		sum2 =sum2+ nums[j];
	}
	
    //3.直接返回相减的结果
	return sum1 - sum2;
}

方法二代码详解:定义一个初始化为0的变量,依次与该数组(n个元素)和0~n(n+1个元素)的每一个数字异或,最后留下来的便是所求的数字了。

时间复杂度:O(n)
空间复杂度:O(1)

int Missingnum(int* nums, int numsSize)
{
	int tmp = 0;

	//1.依次与数组的每一个元素异或
	for (int i = 0; i < numsSize; i++)
	{
		tmp = tmp ^ nums[i];
	}

	//2.依次与0~n数字异或
	for (int j = 0; j < numsSize +1; j++)
	{
		tmp = tmp ^j;
	}
    
    //3.返回异或的结果
	return tmp;
}
 

第五部分:总结收获

        通过这道题,  深刻体会到位运算中异或的巧妙之处,主要是利用了异或的重要性质:两个相同的数异或结果一定是0,0和任何数异或是它本身,并且满足交换律和结合律的,因此,位运算它是没有顺序之分的,改变数的运算顺序,并不会改变最后的结果。

      在后面的刷题中,注意总结这类题型,达到触类旁通!

         在后续更新中,我会一直写关于OJ题的题解,有兴趣的小伙伴可以关注作者,和作者讨论其他OJ题目,如果觉得内容不错,请给个一键三连吧,蟹蟹你哟!!!制作不易,如有不正之处敬请指出,感谢大家的来访,UU们的观看是我坚持下去的动力,
在时间的催化剂下,让我们彼此都成为更优秀的人吧!!!

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

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

相关文章

WebView基础知识以及Androidx-WebKit的使用

文章目录 摘要WebView基础一、启动调整模式二、WebChromeClient三、WebViewClient四、WebSettings五、WebView和Native交互 Androidx-WebKit一、启动安全浏览服务二、设置代理三、安全的 WebView 和 Native 通信支持四、文件传递五、深色主题的支持六、JavaScript and WebAssem…

邮件大附件系统如何进行安全、高效的大附件发送?

邮件大附件系统是一套解决传统电子邮件系统&#xff0c;在发送大文件时遇到限制的解决方案。由于传统电子邮件系统通常对附件大小有限制&#xff0c;这使得发送大文件变得困难。邮件大附件系统通过各种技术手段&#xff0c;允许用户发送超过传统限制的大文件&#xff0c;通常在…

【随笔】Git 高级篇 -- 上传命令的参数 (下)git push(三十七)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

目标检测——低光可见光-红外配对数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

TypeScript学习日志-第二十四天(webpack构建ts+vue3)

webpack构建tsvue3 一、构建项目目录 如图&#xff1a; shim.d.ts 这个文件用于让ts识别.vue后缀的 后续会说 并且给 tsconfig.json 增加配置项 "include": ["src/**/*"] 二、基础构建 安装依赖 安装如下依赖&#xff1a; npm install webpack -D …

11.偏向锁原理及其实战

文章目录 偏向锁原理及其实战1.偏向锁原理2.偏向锁案例代码演示2.1.偏向锁案例代码2.2.1.无锁情况下状态2.1.2.偏向锁状态2.1.3.释放锁后的状态 2.2.偏向锁的膨胀和撤销2.2.1.偏向锁撤销的条件2.2.2.偏向锁的撤销 2.2.3.偏向锁的膨胀 2.3.全局安全点原理和偏向锁撤销性能问题2.…

在R的 RGui中,使用devtools 安装trajeR

创建于&#xff1a;2024.5.5 文章目录 1. 报错信息2. 尝试使用指定的清华镜像&#xff0c;没有解决3. 找到原因&#xff1a;官网把包删除了4. 尝试从网上下载&#xff0c;然后安装。没有成功5. 使用devtools安装5.1 尝试直接安装&#xff1a;install.packages("devtools&q…

OpenCV | 项目 | 虚拟绘画

OpenCV | 项目 | 虚拟绘画 捕捉摄像头 如果在虚拟机中运行&#xff0c;请确保虚拟机摄像头打开。 #include<opencv2/opencv.hpp>using namespace cv; using namespace std;int main() {VideoCapture cap(0);Mat img;while(1) {cap.read(img);imshow("Image"…

JetBrains的Java集成开发环境IntelliJ 2024.1版本在Windows/Linux系统的下载与安装配置

目录 前言一、IntelliJ在Windows安装二、IntelliJ在Linux安装三、Windows下使用配置四、Linux下使用配置总结 前言 ​ “ IntelliJ IDEA Ultimate是一款功能强大的Java集成开发环境&#xff08;IDE&#xff09;。它提供了丰富的功能和工具&#xff0c;可以帮助开发人员更高效地…

labview技术交流-将时间字符串转换成时间格式

应用场景 我们在数据库中设计了datetime类型的字段&#xff0c;比如字段名就叫“保存时间”&#xff0c;当我们使用labview将表中数据读取出来后datetime类型的数据是以字符串的格式显示的。而我们想计算两条数据“保存时间”的间隔时间时&#xff0c;用字符串类型自然是没法计…

uniapp读取项目本地文件/json文件/txt文件

uniapp读取项目本地文件/json文件/txt文件 文件必须放在static目录下 方法&#xff1a; /*** 访问static里面的文件* param url 文件路径 必须在static目录下*/ function localFetch(url) {return new Promise((resolve, reject) > {plus.io.resolveLocalFileSystemURL(_ww…

OmniReader Pro mac激活版:智慧阅读新选择,开启高效学习之旅

在追求知识的道路上&#xff0c;一款优秀的阅读工具是不可或缺的。OmniReader Pro作为智慧阅读的新选择&#xff0c;以其独特的功能和卓越的性能&#xff0c;为您开启高效学习之旅。 OmniReader Pro具备高效的文本识别和处理技术&#xff0c;能够快速准确地提取文档中的关键信息…

PXE批量部署,一键安装配置多台Linux系统

目录 一、PXE批量部署的优点 二、搭建PXE远程安装服务器 1. 实验初始化设置 2. 一键安装软件包 3. 复制 vmlinuz、initrd.img、pxelinux.0文件 4. 配置PE启动菜单配置文件 5. 修改配置文件&#xff0c; 启动各个软件服务 6. kickstart自动应答文件修改启动菜单配置文件…

(一)Linux的vim编辑器的使用

一.vim编辑器 Vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。 二…

不抽象:Increase API 设计原则

原文&#xff1a;Increase - 2024.04.26 &#xff08;注&#xff1a;Increase 是一家提供金融技术服务的公司。&#xff09; API 资源是 API 的实体或对象。决定如何为这些实体命名和建模可以说是设计 API 最难也是最重要的部分。您所公开的资源组织了用户对您的产品如何工作…

什么才是正确的领域驱动实现架构?

作为一种系统建模方法&#xff0c;DDD同样涉及系统的体系架构设计。区别于分布式、事件驱动、消息总线等架构设计方法&#xff0c;DDD中的架构设计关注前面各章所介绍的聚合、实体、值对象、领域事件、应用服务以及资源库之间的交互方式和风格&#xff0c;并在设计思想上有其独…

揭秘设计师必备神器:情绪板是什么?

每个伟大的设计项目都从一点灵感开始。无论你是在设计网站、应用程序&#xff0c;还是想重新装修房子&#xff0c;情绪板都可以帮助你激发创造力&#xff0c;甚至情绪板也可以决定UI界面是否成功。本文将分享什么是情绪板&#xff0c;为什么需要情绪板&#xff0c;以及如何充分…

Linux下多线程相关概念

thread 1.什么是线程1.1 线程优缺点1.2 线程异常1.3 线程用途 2. 进程和线程区别3. 线程控制3.1 POSIX线程库3.2 pthread_create()3.3 线程ID3.4 线程ID地址空间布局pthread_self() 3.5 线程终止pthread_exit函数pthread_cancle函数 3.6 线程等待3.7 分离线程__thread修饰全局变…

OpenCV Radon变换探测直线(拉东变换)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 Radon变换可以将原始图像中直线特征的处理问题转化为变换域图像中对应点特征的处理问题,其中对应特征点的横坐标表示原始图像的旋转角度,一般来讲原始图像中的噪声不会分布在直线的特征上。因此,Radon变换在探测…

Python实战开发及案例分析(12)—— 模拟退火算法

模拟退火算法&#xff08;Simulated Annealing&#xff09;是一种概率搜索算法&#xff0c;源自于金属退火过程。在金属退火中&#xff0c;通过缓慢降低温度&#xff0c;金属内部的原子能够从高能态逐步达到较低能态。模拟退火算法利用类似的原理&#xff0c;通过随机搜索和概率…