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

图片来源于网络

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

消失的数字

  • 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,一经查实,立即删除!

相关文章

Android cmdline-tools 版本与其最小JDK关系

关键词&#xff1a;Android cmdline-tools 历史版本、Android cmdline-tools 最小JDK版本、JDK 对应 major version、JDK LTS 信息 由于 JDK8 是一个常用的、较低的版本&#xff0c;因此只需要关注 JDK8 及以上版本的运行情况。 cmdline-tools 版本和最低 JDK 最终结论&…

【c++】模拟实现stack和queue

全部代码 栈 #pragma once #include<deque> using namespace std;namespace hqj {template<class T, class Con deque<T>>class stack{public:stack():_c(){}void push(const T& x){_c.push_back(x);}void pop(){_c.pop_back();}T& top(){return …

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;普通数组和文档数组。 一、…

彻底理解Linux的crontab

规则 crontab 表示的是: 分 小时 日 月 星期 minute: 表示分钟,可以是从0到59之间的任何整数。hour:表示小时,可以是从0到23之间的任何整数。day:表示日期,可以是从1到31之间的任何整数。month:表示月份,可以是从1到12之间的任何整数。week:表示星期几,可以是从0到…

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的相关语句 。

【DEBUG】mmseg训练报错RuntimeError: Trying to resize storage that is not resizable

&#x1f680;debug专栏 ❓❓问题1&#xff1a; 今天mmseg训练&#xff0c;遇到了个bug&#xff0c;先是在dataloder那报了这样一个错RuntimeError: Caught RuntimeError in DataLoader worker process 0. 然后后面报错RuntimeError: Trying to resize storage that is not re…

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)

LeetCode每日一题——2678. Number of Senior Citizens

文章目录 一、题目二、题解 一、题目 You are given a 0-indexed array of strings details. Each element of details provides information about a given passenger compressed into a string of length 15. The system is such that: The first ten characters consist o…

螺旋矩阵[中等]

优质博文&#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…

Ubuntu和Windows共享目录设置

目录 01. 概述 02. Ubuntu22.04和Windows共享目录设置 03. 共享文件夹找不到问题 下面主要以Ubuntu22.04与Windows为例。 01. 概述 Ubuntu22.04和Windows可以通过VMWare Tools的功能设置目录共享。