本题来源于 面试题 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).