问题描述:数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
示例1
{0,3,1}
输出 [2]
示例2
{9,8,5,0,1,4,7,3,6}
输出 [2]
本题思路:
这个题如果不考虑时间复杂度可以先排序,再用另一个有序且跟它缺少那个数字前的数据一样的数组,让相同下标的数相异或,如果两个异或不为0就直接返回那个有序的数组的数据,它就是数组缺少的数。
现在考虑时间复杂度我们完全可以把数组的所有数据和下标异或在一起最后剩下的便是数组缺少的数;
原理:
0和任何数异或都是那个数本身,同样两个数相异或都是0。
#include<stdio.h>
int missingNumber(int* n, int m) {
int ret = 0;
//这里实现所有数据和下标异或在一起
//如果这里改成i<=m数组就会越界
//但是这样就缺少和m这个下标相异或了
for (int i = 0; i < m; i++) {
ret ^= i;
ret ^= n[i];
}
//数组本来只有m-1个数,没算缺少的数字。
//里面也包括m这个数,如果只异或到下标m-1
//最后就剩下缺少那个数和m相异或的数了
ret^=m;
return ret;
}
int main() {
int arr[] = {3,0,1};
int num = sizeof(arr) / sizeof(int);
int m = missingNumber(arr, num);
printf("%d", m);
return 0;
}