数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
注意:本题相对书上原题稍作改动
示例 1:
输入:[3, 0, 1]
输出:2
示例 2:
输入:[9, 6, 4, 2 , 3, 5, 7, 0, 1]
输出:8
来源:力扣(LeetCode)
思路一:
排序,但是时间复杂度不满足,因为最快的排序,其时间复杂度也达不到题目的要求。
思路二:
1.把从0到n的所有整数加在一起结果是sum1
2.把数组中的所有元素相加在一起结果是sum23.最后用sum1-sum2其结果就是缺失的那个数字
思路三:
异或(^):相同为0,相异为1(指的是二进制位)。
1 .把数组中的元素全部异或在一起 :
tmp= nums[0] ^ nums[1] ^ … ^ nums[numsSize-1]
2.用tmp异或从0到n的所有整数,其结果就是缺失的那个数字
思路一:读者有兴趣可自己实现。
思路二:
int missingNumber(int* nums, int numsSize)
{
int i = 0;
int sum1 = 0;
int sum2 = 0;
//把从0到n的所有整数累加到sum1
for (i = 0; i <= numsSize; i++)
{
sum1 += i;
}
//把数组中的所有元素累加在到sum2
for (i = 0; i < numsSize; i++)
{
sum2 += nums[i];
}
return sum1 - sum2;
}
思路三:
int missingNumber(int* nums, int numsSize)
{
int i = 0;
int tmp = 0;
//把数组中的元素全部异或在一起,存到tmp中
for (i = 0; i < numsSize; i++)
{
tmp ^= nums[i];
}
//用tmp异或从0到n的所有整数
for (i = 0; i <= numsSize; i++)
{
tmp ^= i;
}
return tmp;
}