思路
思路1
位运算。利用异或运算(xor),依次将index和nums[index]进行异或操作,由于异或的性质是相同为0,不同为1,将整个数组的索引和值一起进行异或的话,没丢失的都为0,最后就剩下一个丢失的数字与0进行异或=丢失的数字。所以最后剩下的数字就是缺失的数字。【对于result,应初始化为数组的长度,因为索引范围是0~n-1,但是值的范围是0~n,要正确进行异或查找丢失的数字,必须将索引范围上缺少的n补回来】
复杂度
时间复杂度O(n), 空间复杂度O(1)
代码
class Solution {
// bit manipulation: xor
public int missingNumber(int[] nums) {
int result = nums.length;
for(int i = 0; i < nums.length; i++) {
result ^= i ^ nums[i];
}
return result;
}
}
思路2
将索引序列和值序列分别求和,二者的和的差值即为丢失的数字。注意溢出问题。
对索引求和可以使用等差数列求和公式sum=n(n+1)2sum=\frac{n(n+1)}2sum=2n(n+1)
复杂度
时间复杂度O(n), 空间复杂度O(1)
代码
class Solution {
// sum
public int missingNumber(int[] nums) {
int n = nums.length;
long sum_index = n*(n+1)/2;
long sum_value = 0;
for(int i : nums) {
sum_value += i;
}
return (int)(sum_index-sum_value);
}
}