当前位置: 首页 > news >正文

力扣--268丢失的数字(三种解法)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

    • 解法1
    • 解法2
    • 解法3


给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。 示例 1:

输入:nums = [3,0,1] 输出:2 解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2
是丢失的数字,因为它没有出现在 nums 中。
示例 2:

输入:nums = [0,1] 输出:2 解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2
是丢失的数字,因为它没有出现在 nums 中。
示例 3:

输入:nums = [9,6,4,2,3,5,7,0,1] 输出:8 解释:n = 9,因为有 9 个数字,所以所有的数字都在范围
[0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。
示例 4:

输入:nums = [0] 输出:1 解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1
是丢失的数字,因为它没有出现在 nums 中。

题目已经清楚的说明了,要我们找到[ 0 n]中数组每出现的数字

解法1

大家看到题的时候的第一想法就是循环嵌套吧,通过遍历来找到那个数字。
好,那么我们就来实现一下

int missingNumber(int* nums, int numsSize) {for (int i = 0; i <= numsSize; i++) {//第一个循环,将[1~n]的数字遍历一次int t=0;//标志变量for (int j =0 ; j < numsSize; j++) {//在数组中寻找i找不到就是的话就是丢失的数字if (nums[j] == i){t = 1;//找到i就是t=1加打破break;}}if (t == 0)return i;//返回丢失的数字}}

优点:这种解法简单,只需要循环嵌套即可
缺点:时间复杂度O(n*n),时间过长可能超过时限

解法2

我们要注意一个点就是这些数字是[ 0 n]且数组数字不重复,那么我们可以将0~n都加起来然后再减去数组中的所有数字,得到的就是丢失的数字了
实现:

int missingNumber(int* nums, int numsSize) {int r=0;for(int i=1;i<=numsSize;i++)//将0-n的数字都加起来r=r+i;     for(int i=0;i<numsSize;i++)r=r-nums[i];减去数组中所有的数字return r;
}

这种解法很好,时间复杂度在O(n),也很容易实现

解法3

第三种方法就是利用异或了

异或有两个性质
1.0和任何一个数异或都等于那个数
2.相同的数字异或的结果为0

我们可以设置一个数为0,再和[0-n]的数字异或,之后再和数组的各个元素异或,这样一来相同的数字就被抵消了,剩下0和丢失的那个数,又因为0和任何一个数异或都等于那个数,所以最后得到的数就是丢失的数字了
实现:

int missingNumber(int* nums, int numsSize) {int r = 0;for (int i = 1; i <= numsSize; i++)//让r和0-n的数字都异或r = r ^ i;for (int i = 0; i < numsSize; i++)//再和数组中的所有元素异或,最终就是丢失的数字了r = r ^ nums[i];return r;

这种解法很好,就是有点难想到,时间复杂度为O(n)

总结

相比于第一种后面的两种在时间上有优势,但是后面两种有点难想到,特别是第三种

今天的分享就到这里了,谢谢大家的观看

相关文章:

  • 基于SSM的校园服务平台管理系统设计与实现
  • java初探之代理模式
  • 如何在interface中处理DUT中的inout信号
  • DatePicker与DatePickerDialog
  • Ubuntu创建新用户
  • ElementPlus el-switch开关页面初始化时,change事件自动触发
  • Python使用Mechanize库完成自动化爬虫程序
  • 窗口管理工具 Mosaic mac中文版功能特点
  • 屏蔽机房与普通机房有什么不同?
  • Unity地面交互效果目录
  • uniapp: 实现pdf预览功能
  • 大数据-之LibrA数据库系统告警处理(ALM-12046 网络写包丢包率超过阈值)
  • 【文件读取/包含】任意文件读取漏洞 afr_1
  • Java实现自定义windows右键菜单
  • 【Nginx】使用nginx进行反向代理与负载均衡
  • 【mysql】环境安装、服务启动、密码设置
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【React系列】如何构建React应用程序
  • CEF与代理
  • classpath对获取配置文件的影响
  • CSS盒模型深入
  • CSS实用技巧干货
  • ES学习笔记(12)--Symbol
  • Java程序员幽默爆笑锦集
  • MySQL数据库运维之数据恢复
  • Next.js之基础概念(二)
  • Odoo domain写法及运用
  • SpiderData 2019年2月25日 DApp数据排行榜
  • web标准化(下)
  • Yeoman_Bower_Grunt
  • 阿里云应用高可用服务公测发布
  • 二维平面内的碰撞检测【一】
  • 爬虫模拟登陆 SegmentFault
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 优化 Vue 项目编译文件大小
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (02)Hive SQL编译成MapReduce任务的过程
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (C语言)逆序输出字符串
  • (办公)springboot配置aop处理请求.
  • (初研) Sentence-embedding fine-tune notebook
  • (二)JAVA使用POI操作excel
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (三)模仿学习-Action数据的模仿
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • ****Linux下Mysql的安装和配置
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)