目录
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
代码框架
cppint 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;
}