L29.【LeetCode笔记】丢失的数字

目录

1.题目

2.解

能容易想到的算法

巧解的算法

代码

更简洁快速的写法:将两个for循环合并

提交结果


1.题目

https://leetcode.cn/problems/missing-number/

数组nums包含从0n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?

示例 1:

复制代码
输入:[3,0,1]
输出:2

示例 2:

复制代码
输入:[9,6,4,2,3,5,7,0,1]
输出:8

代码框架

cpp 复制代码
int missingNumber(int* nums, int numsSize)
{
}

注意:时间复杂度为并不意味着运行次数为N,运行次数的的通用表达式为kN+c(这里的k和c均为常数)

2.解

能容易想到的算法

冒泡排序或快速排序+遍历筛选未出现的数字或二分查找

但无论排序方式和查找方式怎么组合,均不符合时间复杂度为(冒泡排序时间复杂度为,快速排序的时间复杂度为)

巧解的算法

本题和

E27.【C语言】练习:在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字

有点像,但并没有出现成对这个条件,为了创造这个条件,可以另外设0~n数字

E27文章提到要判断两个元素是否相同可以使用异或运算

以[3,0,1]为例分析,将[3,0,1]与完整的[0,1,2,3]去异或,即(3^0^1)^(0^1^2^3),由于异或满足交换律,则

(3^0^1)^(0^1^2^3)==(0^0)^(1^1)^(3^3)^2==2,恰为需要求的数字

代码

cpp 复制代码
int missingNumber(int* nums, int numsSize)
{
	int val = 0;
	for (int i = 0; i < numsSize; i++)
	{
		val ^= nums[i];
	}
	for (int i = 0; i < numsSize+1; i++)
	{
		val ^= i;
	}
	return val;
}

更简洁快速的写法:将两个for循环合并

cpp 复制代码
int missingNumber(int* nums, int numsSize) 
{
    int ret=0;
    for (int i=0;i<numsSize;i++)
    {
        ret^=i;
        ret^=nums[i];
    }
    return ret^numsSize;
}

提交结果

相关推荐
我是菜鸟0713号1 分钟前
Qt 中 OPC UA 通讯实战
开发语言·qt
JCBP_3 分钟前
QT(4)
开发语言·汇编·c++·qt·算法
码熔burning7 分钟前
JVM 垃圾收集算法详解!
jvm·算法
Brookty7 分钟前
【JavaEE】线程安全-内存可见性、指令全排序
java·开发语言·后端·java-ee·线程安全·内存可见性·指令重排序
百锦再21 分钟前
[特殊字符] Python在CentOS系统执行深度指南
开发语言·python·plotly·django·centos·virtualenv·pygame
Anson Jiang21 分钟前
浏览器标签页管理:使用chrome.tabs API实现新建、切换、抓取内容——Chrome插件开发从入门到精通系列教程06
开发语言·前端·javascript·chrome·ecmascript·chrome devtools·chrome插件
小柴狗29 分钟前
C语言关键字详解:static、const、volatile
算法
会开花的二叉树30 分钟前
继承与组合:C++面向对象的核心
java·开发语言·c++
长河2 小时前
Java开发者LLM实战——LangChain4j最新版教学知识库实战
java·开发语言
第七序章2 小时前
【C++STL】list的详细用法和底层实现
c语言·c++·自然语言处理·list