本题来源于 面试题 17.04. 消失的数字
题目如下:
数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
注意:本题相对书上原题稍作改动
示例 1:
输入:[3,0,1]
输出:2
示例 2:
输入:[9,6,4,2,3,5,7,0,1]
输出:8
思路
此题有两种比较优的方法做,第一种方法首先是用等差数列求和公式算出0 – n前n+1项的和,之后减去数组的和,得到的就是少掉的数字。
而第二种方法用到了异或,我们先把0到n异或一遍
之后再把数组元素异或一遍,接着再让两个值异或一遍,由于异或有交换律,且相同元素异或之后一定为0,那么最后只剩下target number。
求和法
int missingNumber(int *nums, int numsSize)
{
// 用等差数列求和再减去nums中的和就是缺少的数字
int sum1 = (numsSize) * (numsSize + 1) / 2;
int sum2 = 0;
int i = 0;
for (i = 0; i < numsSize; i++)
{
sum2 += *(nums + i);
}
int ret = sum1 - sum2;
return ret;
}
异或法
int missingNumber(int *nums, int numsSize)
{
int x = 0;
//0到n异或
int i = 0;
for (i = 0; i < numsSize + 1; i++)
{
x = x ^ i;
}
//数组元素互相异或
int r = 0;
for (i = 0; i < numsSize; i++)
{
r = r ^ nums[i];
}
//最后一次异或
int xor = x ^ r;
return xor;
}
分析
两种方法时间复杂度都是O(n).