缺失数字

给定一个包含 0, 1, 2, ..., nn 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。

示例 1:

1
2
输入: [3,0,1]
输出: 2

示例 2:

1
2
输入: [9,6,4,2,3,5,7,0,1]
输出: 8

说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?

代码

首先想到高斯算法,但是有溢出的可能性

1
2
3
4
5
6
7
8
9
10
public int missingNumber(int[] nums) {
//得到最大的数
int lager=nums.length;
int sum=0;
for(int i=0;i<nums.length;i++){
sum+=nums[i];
}
//首项+末项*项数/2-已有总和
return (0+lager)*(lager+1)/2-sum;
}

进阶

似乎忘记了以前的异或^运算符了,这种方法更为安全和快速,举个例子:

  • 0 ^ 4 = 4
  • 4 ^ 4 = 0

那么,就可以不用求和,直接使用异或运算^进行 抵消,剩下的数字就是缺失的了。

再举个例子:

  • 1^1^2^2^3 = 3
1
2
3
4
5
6
7
8
public int missingNumber(int[] nums) {
int result=nums.length;
for(int i=0;i<nums.length;i++){
result^=nums[i];
result^=i;
}
return result;
}