【数据结构练习题】消失的数字 --- 三种解法超详解

图片来源于网络

✨博客主页:小钱编程成长记
🎈博客专栏:数据结构练习题
🎈相关博文:添加逗号

消失的数字

  • 1. 🎈题目
  • 2. 🎈解题思路
    • ✨方法一:先排序,再找缺失的值
    • ✨方法二:按位异或,找缺失的值
    • ✨方法三:相减,找缺失的值
  • 🎈具体代码
    • 方法一:
    • 方法二:
    • 方法三:
  • 🎇总结

1. 🎈题目

在这里插入图片描述
力扣链接

2. 🎈解题思路

✨方法一:先排序,再找缺失的值

1.先用冒泡排序将数组排成有序的。
在这里插入图片描述
2.遍历每个元素,判断+1后是否等于后面一个元素。如果不等于,则+1后得到得数字就是缺失的数字。因为要遍历N(未知)次,所以O(N)
》整体时间复杂度为最高阶项O(N^2)

✨方法二:按位异或,找缺失的值

对于整数a: a ^ a ==00 ^ a == a;(支持分配律)
1.让0 ^ 数组中的每个数,再 ^ 数字1~n。在这个式子里,数组中未缺少的数会有两个,按位异或得0;缺少的只有一个,与0按位异或后就得出了这个缺少的数。
》因为会进行N(未知)次 ^ 操作,所以时间复杂度为O(N)

✨方法三:相减,找缺失的值

1.将1~n个数相加得到和sum
2.用sum 减去数组中的元素,得到的就是数组中缺少的元素
》因为出现了N(未知)次减元素的操作,所以时间复杂度为O(N)

🎈具体代码

方法一:

//时间复杂度O(n^2)
int missingNumber(int* nums, int numsSize) {//冒泡排序int i = 0;for (i = 0; i < numsSize - 1; ++i){int j = 0;for (j = 0; j < numsSize - 1 - i; ++j){if (nums[j] > nums[j + 1]){int tmp = nums[j];nums[j] = nums[j + 1];nums[j + 1] = tmp;}}}//判断前面的数+1是否 == 后面的数for (i = 0; i < numsSize - 1; ++i)//比较numsSize-1次,判断前面的数+1是否 == 后面的数{if (0 != nums[0])//如果第一个数不是0,则说明缺少0{break;}if (nums[i] + 1 == nums[i + 1])//不严谨,第1的数不是0时,条件也都成立{continue;}else{break;}}if (0 != nums[0]){return 0;}else{return nums[i] + 1;}
}

方法二:

//时间复杂度O(n)
int missingNumber(int* nums, int numsSize) {//两个相同的数按位异或,得0; 0 ^ a == a//举例:0^1^2^1 == 2int x = 0;int i = 0;for (i = 0; i < numsSize; ++i)//0~n中少了一个数,所以共n个数{x ^= nums[i];}for (i = 0; i <= numsSize; ++i)//按位异或 从0 到 n的数{x ^= i;}return x;
}

方法三:

//时间复杂度O(n)
int missingNumber(int* nums, int numsSize) {//计算0~n个数的和(等差数列,差为1)//0~n共 numsSize+1个数,所以n == numsSizeint sum = (0 + numsSize) * (numsSize + 1) / 2;//计算nums中元素的和int i = 0;int sum2 = 0;for (i = 0; i < numsSize; ++i){sum2 += nums[i];}return sum - sum2;
}

🎇总结

本篇文章我们用三种方法,逐渐减少时间复杂度,解决了力扣上消失的数字这道题,感谢大家的阅读!大家一起进步!

点赞收藏加关注,C语言学习不迷路!
图片来源于网络

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

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

相关文章

scrapy的安装和使用

一、scrapy是什么&#xff1a;Scrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架&#xff0c;可以应用在包括数据挖掘&#xff0c;信息处理或存储历史数据等一系列的程序 二、scrapy的安装&#xff1a;pip install scrapy -i https://pypi.douban.com/…

如何系列 如何玩转远程调用之OpenFegin+SpringBoot(非Cloud)

文章目录 简介原生Fegin示例基础契约日志重试编码器/解码器自定义解码器 请求拦截器响应拦截器表单文件上传支持错误解码器断路器指标metrics客户端 配合SpringBoot&#xff08;阶段一&#xff09;配合SpringBoot&#xff08;阶段二&#xff09;1.EnableLakerFeignClients2.Lak…

初识Kubernetes

一、k8s的由来及其技术运用 1.1 k8s的简介 Kubernetes&#xff0c;词根源于希腊语的 舵手、飞行员。在国内又称k8s&#xff08;因为k和s之间有8个字母&#xff0c;所以得名。“国内程序员的幽默”&#xff09;。用于自动部署、扩展和管理“容器化&#xff08;containerized…

【软件安装】Linux系统中安装MySQL数据库服务

这篇文章&#xff0c;主要介绍如何在Linux系统中安装MySQL数据库服务。 目录 一、Linux安装MySQL 1.1、下载MySQL安装包 1.2、解压MySQL安装包 1.3、更改存放目录 1.4、创建用户组和用户 1.5、创建数据目录data 1.6、创建my.cnf配置文件 1.7、初始化数据库 1.8、添加m…

云计算要学习哪些技术?

学习云计算需要涉及多个技术领域和相关的工具、平台和框架。以下是一个详细的介绍&#xff0c;帮助您了解学习云计算所需的技术。 1. 虚拟化技术 虚拟化是云计算的基础&#xff0c;因此了解虚拟化技术至关重要。学习虚拟化技术时&#xff0c;需要掌握以下知识点&#xff1a; …

C# 使用 LibUsbDotNet 实现 USB 设备检测

国庆节回来后的工作内容&#xff0c;基本都在围绕着各种各样的硬件展开&#xff0c;这无疑让本就漫长的 “七天班” &#xff0c;更加平添了三分枯燥&#xff0c;我甚至在不知不觉中学会了&#xff0c;如何给打印机装上不同尺寸的纸张。华为的 Mate 60 发布以后&#xff0c;人群…

RK3568平台开发系列讲解(应用篇)串口应用编程之串口介绍

🚀返回专栏总目录 文章目录 一、串口介绍1.1、数据传输方式1.2、数据格式1.3、波特率1.4、硬件流控制和软件流控制1.5、错误检测1.6、串口编程二、串口设备节点介绍沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 串口设备是嵌入式开发中最常用的外设之一,通过串口…

图论01-【无权无向】-图的基本表示-邻接矩阵/邻接表

文章目录 1. 代码仓库2. 图的基本表示的比较3. 邻接矩阵&#xff1a;Array和TreeSet3.1 图示3.2 Array主要代码解析3.3 测试输出3.4 使用TreeSet的代码 4. 邻接表&#xff1a;LinkedList4.1 图示4.2 LinkedList主要代码解析4.3 测试输出 5. 完整代码5.1 邻接表 - Array5.2 邻接…

数据库MongoDB

MongoDB记录是一个文档&#xff0c;由一个字段和值对组成的数据结构&#xff0c;文档类似于JSON对象。 一个文档认为就是一个对象&#xff0c;字段的数据类型是字符型&#xff0c;值除了使用基本类型外&#xff0c;还可以包括其他文档&#xff0c;普通数组和文档数组。 一、…

rust学习——方法 Method

文章目录 方法 Method定义方法self、&self 和 &mut self方法名跟结构体字段名相同 带有多个参数的方法关联函数多个 impl 定义为枚举实现方法 rust 结构体与枚举的区别回答1回答2 方法 Method 从面向对象语言过来的同学对于方法肯定不陌生&#xff0c;class 里面就充斥…

【proteus】8086仿真/汇编:创建项目并添加汇编代码文件

1.创建好新项目 2.点击source code 弹出VSM 3. 4.注意两个都不勾选 可以看到schematic有原理图出现 5. 再次点击source code 6.project/project settings&#xff0c;取消勾选embed 7. add 8.输入文件名保存后&#xff1a; 注意&#xff1a;proteus不用写dos的相关语句 。

C++第一篇--关键字以及命名空间

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 &#x1f384; 前言 …

31一维信号滤波(限幅滤波、中值滤波、均值滤波、递推平均滤波),MATLAB程序已调通,可直接运行。

一维信号滤波&#xff08;限幅滤波、中值滤波、均值滤波、递推平均滤波&#xff09;&#xff0c;MATLAB程序已调通&#xff0c;可直接运行。 31matlab、中值滤波、信号处理 (xiaohongshu.com)

螺旋矩阵[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个m行n列的矩阵matrix&#xff0c;请按照顺时针螺旋顺序&#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2&#xf…

性能优化:JIT即时编译与AOT提前编译

优质博文&#xff1a;IT-BLOG-CN 一、简介 JIT与AOT的区别&#xff1a; 两种不同的编译方式&#xff0c;主要区别在于是否处于运行时进行编译。 JIT:Just-in-time动态(即时)编译&#xff0c;边运行边编译&#xff1a;在程序运行时&#xff0c;根据算法计算出热点代码&#xf…

【题解 单调队列优化dp】 简单的加法乘法计算题

题目描述&#xff1a; 分析&#xff1a; 由于对于每一步而言&#xff0c;我们都需要的是最小步数 所以我们很显然的可以写出一个dp方程&#xff1a; 设 f [ i ] f[i] f[i]表示达到i时的最小步数 我们有两种操作&#xff0c;也就是说我们可以通过一下两种方式转移过来&#xff…

解决使用WebTestClient访问接口报[185c31bb] 500 Server Error for HTTP GET “/**“

解决使用WebTestClient访问接口报[185c31bb] 500 Server Error for HTTP GET "/**" 问题发现问题解决 问题发现 WebTestClient 是 Spring WebFlux 框架中提供的用于测试 Web 请求的客户端工具。它可以不用启动服务器&#xff0c;模拟发送 HTTP 请求并验证服务器的响…

力扣刷题 day54:10-24

1.十进制整数的反码 每个非负整数 N 都有其二进制表示。例如&#xff0c; 5 可以被表示为二进制 "101"&#xff0c;11 可以用二进制 "1011" 表示&#xff0c;依此类推。注意&#xff0c;除 N 0 外&#xff0c;任何二进制表示中都不含前导零。 二进制的反…

CPU眼里的C/C++:1.2 查看变量和函数在内存中的存储位置

写一个很简单的 c 代码&#xff0c;打印一些“地址”&#xff0c; 也就是变量、函数的“存储位置”&#xff1a;当程序被加载到内存后&#xff0c;它们具体是存在哪里&#xff0c;可以用精确的数值来表示&#xff0c;这就是内存地址。 https://godbolt.org/z/Ghh9ThY5Y #inc…

Java基础篇 | Java8流式编程

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…