既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
一.🏠题目描述
**兄弟们,废话不多说直接看题:**🙉🙉🙊
示例1:
输入:[3,0,1]
输出:2
示例2:
输入:[9,6,4,2,3,5,7,0,1]
输出:8
二.🏠题目分析
**这道题目看似比较简单,实际我们在其中还是可以学到很多的知识。我们先标识一下题目中比较重要的点~~**🙉🙉
由图片分析可得,该题目对算法由一定的要求,首先我们得明白时间复杂度为O(N)算法意味着什么。我们先来看看算法的时间复杂度对比图,在大概了解到题目所需要的算法优化程度后,我们就可以着手来做题目啦😎😎😎
三.🏠解决方法
1.🚀思路一:先排序再查找
既然是0~n内的整数,且仅仅缺少了一个整数,那么我们就可以先对该数组进行排序,再检验相邻下标的元素是否相差为1,理论上便可以得出最后的结果。
在这里小生不得不提醒大家,排序的复杂度是相当高的,即便是最复杂度最小的快排,在这个程序内也不合适。我们可以通过图片来认识😯😯😯
由该表可知,当我们使用效率最高的排序且考虑最坏的情况时,复杂度为N*log2(N),显然在这个题目中超出了复杂度的要求,因此,这种思路虽然是最直接的但是一定会超时。别慌,我们再想想其他办法。
2.🚀思路二:逆推相减
**具体问题具体分析,既然我们该数组存储的是0~n里面的整数且只缺少了一个整数,那我们可以用将0 ~ n所有的整数相加,再把该数组中的整数相加最后两个和向减即可。**💪💪💪
但是我们可以举一反三,如果题目更改一下,缺失的并非一个数字而是多个数字呢?那这种方法是不是就不起作用啦?这种方法还是不错的,那有没有更加普适性的方法呢?大家可以思考一下
3.🚀思路三:异或运算求解
位与位异或,相同为0,不相同为1.同时,因为异或是位与位进行计算的,所以异或的顺序不重要,结果是一样的,由此,在我们这个题目中,我们可以通过一下思路实现:
因为异或相同得零,不同得1,所以使用一个变量将数组中所有元素异或,然后再和1到n进行异或,得到的就是消失的数字😎😎😎
四.🏠代码实现
1.🚀方法一代码详解
定义两个变量,一个通过循环存储数组所有元素的和,一个通过循环存储1~n所有数字的和,最后相减即可。
代码如下👇👇👇👇
int Missingnum(int\* nums, int numsSize)
{
int sum1 = 0;
int sum2 = 0;
//求出数组所有元素之和
![img](https://img-blog.csdnimg.cn/img_convert/17c9b3e1cb2c33b42cb0f98d493879d0.png)
![img](https://img-blog.csdnimg.cn/img_convert/f489d36d5f73ad6511a7e2d9aa745e49.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**