思路:异或运算 或者数学加减法(近更:文末)
由于数组的长度为数字范围的最大值,于是可以构造出包含缺失值的数组[0,nums.length]。
而数组nums不包含缺失值,也就是说这两个数组存在的唯一一个不同的数,其它
都是两两相同,根据该特性可利用异或运算得出缺失值
异或运算重点: 2^2=0(去掉重复), 0^任何数=任何数(不变)
class Solution {
//快排,遍历一遍,数组值不等于下标值则为丢失的数字
public int missingNumber1(int[] nums) {
Arrays.sort(nums);
int ans = nums.length;
for(int i=0; i < nums.length; i++){
if(i != nums[i]) {
ans = i;
return ans;
}
}
return ans;
}
//异或运算
public int missingNumber(int[] nums) {
int ans = nums.length;
//这里遍历两个素组合并为一个循环,利用下标作为包含缺失值的数组--分开写也行
for(int i = 0;i < nums.length; i++){
ans = ans ^ i ^ nums[i];
}
return ans;
}
}
更新:突然发现用数学加减法就能解决了
public int missingNumber(int[] nums) {
//法三 数学规律问题
/*理解版
int res = 0;//结果
int sum1 = 0; //0到n的和
int sum2 = 0; //数组内元素之和
规律 res = sum1 - sum2,即sum1和sum2之差为丢失数字
*/
//简化版
int res=0;
for(int i=0; i<nums.length; i++) {
res = res + i - nums[i];
}
res += nums.length;
return res;
}