268. 缺失数字
难度:简单
题目描述
解题思路
最简单的可以用桶计数或者排序,然后找到没出现过的数字。但是题目要求线性时间复杂度,所以不能排序,又只使用额外常数空间,也不能用桶计数。
因为这个题里数据范围是确定的,而且只缺失一个正整数,所以可以先计算0~n的和,然后依次减去数组里的元素,剩下来的就是没出现过的。考虑到如果数组范围很大那直接算和可能会溢出,所以边加边减,一样能达到效果。
1、计算累加和
public int missingNumber(int[] nums) {
int sum = 0;
//直接相加求和可能会溢出,所以边加边减
for (int i = 0; i < nums.length; i++) {
sum += i;
sum -= nums[i];
}
sum += nums.length;
return sum;
}
2、位运算
和重复出现的数字那道题有点像,利用异或的性质,同0异1,而且0异或别的数字就等于他本身。
1^ 1 ^ 2^ 2^ 3 = 3
全部要注意一个细节就是数字的范围,数字范围0~9,因为缺了一味,所以数组长度是9,最大下标只能到8,所以要额外把9再做一次异或
public int missingNumber(int[] nums) {
int re = nums.length;
//异或,最后剩下来的就是没出现过的
for (int i = 0; i < nums.length; i++) {
re ^= nums[i];
re ^= i;
}
return re;
}