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

目录

1.题目

2.解

能容易想到的算法

巧解的算法

代码

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

提交结果


1.题目

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

数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在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;
}

提交结果

相关推荐
旖旎夜光24 分钟前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
揽星河..42 分钟前
【C语言】结构体
c语言·开发语言
2601_966949651 小时前
如何封装 qd.klines.batch(),让批量 K 线查询函数在多个策略中复用?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
小超人诞生日记1 小时前
C++ 智能指针的使用及其原理详解
c++·算法
神仙别闹2 小时前
基于Python实现英词语自动对齐系统
开发语言·python
唐青枫2 小时前
C 语言 malloc() 详解与实战 Demo
c语言
akinggw2 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
老歌老听老掉牙3 小时前
圆柱端面四平面交线及其在yoz面投影的几何解析与 Python 实现
开发语言·python·平面
旖旎夜光3 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习