目录
消失的数字
问题描述:
数组
nums
包含从0
到n
的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
示例: 输入:[3,0,1] 输出:2 输入:[9,6,4,2,3,5,7,0,1] 输出:8
解题思路:
等差数列法
用等差数列公式S=(n(n+1))/2。将前n个数的和用等差数列公式计算出,然后用总合减去数组中出现的每一个数,结果即为缺失的数字。
代码实现如下:
int missingNumber(int* nums, int numsSize) //等差数列公式
{
int sum = (numsSize*(numsSize + 1)) / 2;
for(int i = 0 ; i < numsSize; i++)
{
sum = sum - nums[i];
}
return sum;
}
异或方法
用异或方法 (相同为0相异为1)。首先将数组中的每个数都和0异或,然后再将异或的结果与0-n的所有整数异或,异或的结果就是缺失的数字。因为,缺失的数字只被异或了一次,其余数字被异或了两次。
代码实现如下:
int missingNumber(int* nums, int numsSize) //异或方法
{
int x =0;
for(int i = 0; i < numsSize; i++) //将数组中的每个数都和X异或
{
x ^= nums[i];
}
for(int i = 0; i < numsSize+1; i++)
//将上次异或的结果x,再与0-n的所有整数异或,异或的结果就是缺失的数字
//因为,缺失的数字只被异或了一次,其余数字被异或了两次
{
x ^= i;
}
return x;
}
两次的结果如下: