数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
注意:本题相对书上原题稍作改动
示例 1:
输入:[3,0,1]
输出:2
示例 2:
输入:[9,6,4,2,3,5,7,0,1]
输出:8
分析:其实题目不难看懂,找一个缺失的数字
思路:1.最简单的思路:求和,1+2+...+n,然后减去输入的数字便能找到,消失的数字
如何通过代码来实现呢?
//求和
class Solution {
public int missingNumber(int[] nums){
int n = nums.length;
int total = n*(n+1)/2;//数学公式求前n项的和
int arrSum = 0;
for(int i=0;i<n;i++)
{
arrSum+=nums[i];//数组内的求和
}
return total-arrSum; //两数相减
}
}
原理简单,方法易懂
2. 采用异或的方法,异或的原理其实很简单,二进制中相同为0,相异为1
首先让设定一个val,等于0^1^2^3^....^n
然后让val^整个输入数组,得到最后的ret便是消失的数字
代码实现
//异或
class Solution {
public int missingNumber(int[] nums){
int val = 0;
for(int i = 0;i<nums.length+1;i++){
val^=i;//异或0到n的所有数字
}
for(int i = 0;i<nums.length;i++){
val^=nums[i];//异或整个数组
}
return val;
}
}
3.空间的灵活使用,
我们把定义一个数组,数组有n个元素,每个元素为-1
然后把输入数组的元素大小,放到我们定义数组的对应位置
我举一个例子:
示例 1:
输入:[3,0,1]
输入数组的元素3,放到我们定义数组的对应位置4上面,
输入数组的元素0,放到我们定义数组的对应位置1上面
输入数组的元素1,放到我们定义数组的对应位置2上面
这时候我们只要找出哪个元素是-1,便可得知哪个是消失的数字
代码展示:
//空间
class Solution {
public int missingNumber(int[] nums){
int[] ret= new int[nums.length+1];
Arrays.fill(ret,-1);
for(int i=0;i<nums.length;i++){
ret[nums[i]]=nums[i];
}
for(int i=0;i<ret.length;i++){
if(ret[i]==-1){
return i;
}
}
return -1;
}
}