消失的数字:
数组nums包含从0到N的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
示例 1:
输入:[3,0,1]
输出:2
示例 2:
输入:[9,6,4,2,3,5,7,0,1]
输出:8
方法一:
思路:对0-N的整数进行排序与数组下标进行对比,如果不同就返回数组下标,即为消失的数字。
class Solution {
public int missingNumber(int[] nums) {
Arrays.sort(nums);
for(int i = 0;i < nums.length;i++)
{
if(i != nums[i]){
return i;
}
}
//在循环中没有找到消失的数字,那么确实的就是数组长度对应的数字N
return nums.length;
}
}
方法二(哈希法):
思路:将原数组映射成一个boolean数组,数组长度为num.length + 1,boolean类型的默认值为false,将原数组遍历后未缺失的位置false变为ture,缺失的位置仍为false。遍历数组,返回false对应的下标即为消失的数字。
class Solution {
public int missingNumber(int[] nums) {
boolean[] hash = new boolean[nums.length + 1];
for(int i = 0; i < nums.length; i++){
hash[nums[i]] = true;
}
for(int i =0; i< hash.length; i++){
if(!hash[i]){
return i;
}
}
return -1;
}
}
方法三(异或法):
思路:
[0,1,3]
0 1 2
res x ^ x = res
遍历原数组时,从0下标开始遍历的~
int res = 0
res ^= i;
res ^= numslil;
res ^= nums.length;
res 0 ^ 0 ^ 1 ^ 1^2 ^ 3 ^ 3
res = 0 ^ 0 ^ 2
class Solution {
public int missingNumber(int[] nums) {
int res = 0;
for(int i = 0;i < nums.length; i++){
res ^= i;
res ^= nums[i];
}
res ^= nums.length;
return res;
}
}