大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
目录
- 1.暴力求解法
- 2.采用异或的方法(同单身狗问题)
- 3.先求和再减去数组元素
点击查看题目
1.暴力求解法
通过2个for循环,遍历查找0-n中缺少的数字,比较简单,不写,时间复杂度为O(N^2)
2.采用异或的方法(同单身狗问题)
点击去了解异或,位置在④.3
异或:两个整数的相同位置:相同为0,不同为1(二进制),易知a^ a=0,a^ 0=a;具有交换律,所以a^ b^ a=a^ a^ b=0^b=b。
在本题中,先使x=0(因为0^ 任何数=任何数本身),再让x与0-n(n是数组的元素个数)的所有数字异或,再让x与nums数组的全部元素异或;当数组为[3,0,1]时,x与0-3的全部数字异或,再与数组元素[3,0,1]异或,即
这样就能得出消失的数字,执行次数为2n+1,时间复杂度为O(N),代码为:
int missingNumber(int* nums, int numsSize) {
int x = 0;
for (int i = 0; i <= numsSize; i++)
{
x ^= i;
}
for (int i = 0; i < numsSize; i++)
{
x ^= nums[i];
}
return x;
}
3.先求和再减去数组元素
先求出0-n(n是数组的元素个数)所有数字之和,再减去数组nums中的所有元素,得到的自然是消失的数字。如当数组为[3,2,0,1]时,求出0-4所有数的和=10,再-0-1-2-3=4,所以消失的数字是4。
时间复杂度为O(N),代码为:
int missingNumber(int* nums, int numsSize) {
int sum = (numsSize+1) * (0 + numsSize) / 2;
for (int i = 0; i < numsSize; i++)
{
sum -= nums[i];
}
return sum;
}
好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️