给定一个数组,大小为n,里面只含有0-n的数字,且不同,那么肯定有一个数字无法包含。找出这个数字。
https://leetcode.com/problems/missing-number/?tab=Description
先介绍一个运用bit操作的算法。首先下标肯定是0到n-1,值是0到n少一个,那么把下标和值一起做xor,最后再和n做xor,缺失的值只出现了一次,其余都是两次。结果就是缺失的值。利用xor操作找出现奇数次的数字。类似思路在single number中介绍过。
public int missingNumber(int[] nums) {
int xor = 0;
for(int i = 0; i < nums.length; i++){
xor = xor ^ nums[i] ^ i;
}
return xor^nums.length;
}
public int missingNumber1(int[] nums) {
for(int i : nums){
int index = i < 0?-(i+1):i;
if(index == nums.length) continue;
if(nums[index] >= 0)
nums[index] = -nums[index] - 1;
}
for(int i = 0; i < nums.length; i++){
if(nums[i] >= 0)
return i;
}
return nums.length;
}
这个思路在另一个遇到过:
https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/?tab=Description