目录
1.消失的数字
面试题 17.04. 消失的数字 - 力扣(LeetCode)
思路1:
求和0到N,再依次减去数组中间值,剩下的那个就是消失数字
时间复杂度:O(N)
int missingNumber(int* nums, int numsSize){
//0-n求和,等差数列
int sum = numsSize*(numsSize+1)/2;
for(int i = 0; i < numsSize; ++i){
//总和减去数组元素
sum -= nums[i];
}
return sum;
}
思路2:
首先我们得清楚异或(^)的原理:相同为0,相异为1,并且0^任何数都等它本身,即(假设ab不相等)a ^ a = 0,a ^ b = b ^ a,0 ^ a = a
利用两个相同的数求异或(^)会变为0,而0与任何数m求异或都是m。那么将数列从头至尾、0~numsSize(让存在的数字能出现第二遍)取异或,最后的结果一定是缺失的数。
//思路2:异或(相同为0,相异为1),符合交换律
int missingNumber(int* nums, int numsSize){
int N=numsSize;
int x=0;
for(int i=0;i<numsSize;++i)
{
x^=nums[i];
}
for(int j=0;j<=N;++j)
{
x^=j;
}
return x;
}