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;
}

提交结果

相关推荐
一条咸鱼_SaltyFish21 分钟前
远程鉴权中心设计:HTTP 与 gRPC 的技术决策与实践
开发语言·网络·网络协议·程序人生·http·开源软件·个人开发
Lips61133 分钟前
2026.1.20力扣刷题笔记
笔记·算法·leetcode
我即将远走丶或许也能高飞33 分钟前
vuex 和 pinia 的学习使用
开发语言·前端·javascript
沐知全栈开发40 分钟前
SQL LEN() 函数详解
开发语言
2501_9413297241 分钟前
YOLOv8-LADH马匹检测识别算法详解与实现
算法·yolo·目标跟踪
洛生&42 分钟前
Planets Queries II(倍增,基环内向森林)
算法
钟离墨笺1 小时前
Go语言--2go基础-->基本数据类型
开发语言·前端·后端·golang
小郭团队1 小时前
1_6_五段式SVPWM (传统算法反正切+DPWM2)算法理论与 MATLAB 实现详解
嵌入式硬件·算法·matlab·dsp开发
小郭团队1 小时前
1_7_五段式SVPWM (传统算法反正切+DPWM3)算法理论与 MATLAB 实现详解
开发语言·嵌入式硬件·算法·matlab·dsp开发
鱼跃鹰飞1 小时前
Leetcode347:前K个高频元素
数据结构·算法·leetcode·面试