问题描述
从0,1,2,…,n这n+1个数中选择n个数,组成有序数组,找出这n个数中缺失的那个数,要求O(n)尽可能小。
输入描述:
输入一个数组(0-n)
输出描述:
输出缺失的数字
示例
示例1
输入
[0,1,2,3,4,5,7]
输出
6
解决思路
分析
- 通过循环
- 通过数学的思路,1-n的和为 n*(n+1)/2
- 通过异或的特性,计算结果
相同的数字异或为0,任意数字与0异或都是原值
方法
- 通过循环,判断前后差值是否大于1
- 通过数学的思路,1-n的和为 n*(n+1)/2 ,依次减去所有的数,得到的结果为缺失的数字
- 通过异或的特性,假设数组0,1,3,4
temp = 4^(0^0)^(1^1)^(2^3)^(3^4)
=(4^4)^(0^0)^(1^1)^(3^3)^2
=0^0^0^0^2
=2
代码实现
// 思路1
public class Solution {
public int solve(int[] a) {
if (a == null || a.length == 0) {
return -1;
}
for (int i = 1; i < a.length; i++) {
if (a[i] - a[i - 1] > 1) {
return a[i] - 1;
}
}
return -1;
}
}
public class Solution {
// 通过数学的方法
public int solveByMath(int[] a) {
if (a == null || a.length == 0) {
return -1;
}
int n = a[a.length - 1];
int sum = n * (n + 1) / 2;
for (int i = 0; i < a.length; i++) {
sum -= a[i];
}
return sum;
}
}
public class Solution {
// 通过位运算
public int solveByBitOperation(int[] a) {
if (a == null || a.length == 0) {
return -1;
}
int temp = a.length;
for (int i = 0; i < a.length; i++) {
temp ^= a[i] ^ i;
}
return temp;
}
}
小伙伴如果想测试的话,可以直接到牛客网这个链接做测试