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

提交结果

相关推荐
AI科技星29 分钟前
基于全域数学公理体系求解三元约束极值题【乖乖数学】
人工智能·算法·机器学习·密码学·拓扑学·乖乖数学·全域数学
科技道人8 小时前
记录 默认置灰/禁用 app ‘Search Engine Selector‘ 的disable按钮
开发语言·前端·javascript
伊玛目的门徒8 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
Jerry8 小时前
LeetCode 226. 翻转二叉树
算法
想做小南娘,发现自己是女生喵10 小时前
【无标题】
数据结构·算法
逝水无殇10 小时前
C# 异常处理详解
开发语言·后端·c#
Kx_Triumphs11 小时前
HDU4348 To the moon(主席树区间修改模板)
算法·题解
旖-旎12 小时前
《LeetCode647 回文子串 || LeetCode 5 最长回文子串》
c++·算法·leetcode·动态规划·哈希算法
玖玥拾12 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#