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

提交结果

相关推荐
Navigator_Z5 小时前
LeetCode //C - 1089. Duplicate Zeros
c语言·算法·leetcode
在繁华处5 小时前
Java从零到熟练(四):面向对象基础
java·开发语言
Unbelievabletobe5 小时前
解决了股票api接口盘后数据更新慢的问题
大数据·开发语言·python
不会C语言的男孩6 小时前
C++ Primer 第2章:变量和基本类型
开发语言·c++
在繁华处7 小时前
Java从零到熟练(三):流程控制
java·开发语言·python
云泽8088 小时前
C++ 可调用对象通关指南:深度解析 Lambda 表达式、function 包装器与 bind 绑定器
开发语言·c++·算法
笨笨没好名字8 小时前
怎么看懂51单片机电路图与功能实现的C语言编写(2-7入门篇)
c语言·嵌入式硬件·51单片机
wlsh158 小时前
Go 迭代器
算法
语戚8 小时前
力扣 3161. 块放置查询:线段树解法(Java 实现)
java·算法·leetcode·面试·线段树·力扣·
CS创新实验室9 小时前
从顺序表到动态数组:数据结构的永恒基石与现代语言的优雅封装
数据结构·算法