题目:
Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.
For example,
Given nums = [0, 1, 3] return 2.
Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?
思路:
一个n维数组,判断0,1,2,3....n 中缺少那一项。
思路1: n! 挨个除数组中不为0 的数,进行判断。 容易溢出 X_X
思路2: 对这个数组和n+1个数进行异或操作,a^a^b=b, 仅出现1次的即所求的数。
实现:
public class Solution {
public int missingNumber(int[] nums) {
int len =nums.length;
int sum=len;
for(int i = 0; i < len; i++){
sum =sum^ i ^nums[i];
}
return sum;
}
}
拓展:
1.求一个数组中,唯一一个仅出现1次的数(其余数字均出现2次)。
public static int singleNumber(int[] nums) {
int res = 0;
for(int tmp : nums){
res = res ^ tmp;
}
return res;
}
2.求一个数组中两个仅出现1次的数字(其余数字均出现2次)。
public static int[] singleNumber2(int[] nums) {
int tmp = 0;
for(int num : nums){
tmp = tmp ^ num;
}
//仅保留最低位1
tmp &= ~(tmp -1);
int res[] = {0,0};
for(int num : nums){
if ((num & tmp) == 0){
res[0] ^= num;
}else{
res[1] ^= num;
}
}
return res;
}