要求:在线性时间内完成
方法一:
求和作差
求出 0 到 n 的和,然后再计算原数组的和,作一个差就是缺失的数字了。
由于数组里每个数字只被访问了一遍,故为线性时间。
```cpp
public int missingNumber(int[] nums) {
int sum1 = 0;
for (int n : nums) {
sum1 += n;
}
// 等差公式计算 1 到 n 的和
int sum2 = (1 + nums.length) * nums.length / 2;
return sum2 - sum1;
}
方法二:
异或
由于一个数异或其本身将变成0,而任何一个数和0异或不变,所以利用这个特点,当我们把缺失了的数组和没缺失元素的数组中的所有元素全部异或,除了缺失的数只出现了一次,其余的数均出现了两次(两两异或变成0),最后的结果便是确实的数。
public int missingNumber(int[] nums) {
int result = nums.length;
for (int i = 0; i < nums.length; i++) {
result = result ^ nums[i] ^ i;
}
return result;
}
方法三:
哈希数组
利用哈希数组的唯一性,遍历寻找(不如前两个)
public int missingNumber(int[] nums) {
HashSet<Integer> set = new HashSet<>();
for (int n : nums) {
set.add(n);
}
//判断 0 到 n 中哪个数字缺失了
for (int i = 0; i <= nums.length; i++) {
if (!set.contains(i)) {
return i;
}
}
return -1;
}