数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
注意:本题相对书上原题稍作改动
示例 1:
输入:[3,0,1]
输出:2
示例 2:
输入:[9,6,4,2,3,5,7,0,1]
输出:8
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/missing-number-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
看了大神的方法,非常厉害啊,计算从 0 到 n 的累加值,然后减去数组中所有元素的值即可,神了,好方法!
class Solution {
public int missingNumber(int[] nums) {
int sum = 0;
int n = nums.length + 1;
for(int i : nums) {
sum += i;
}
return (((n)*(n - 1) / 2) - sum);
}
}
位运算求解:由于异或具有以下的性质
1、0 和 a 异或结果是 a
2、异或具有交换律 a ^ b ^ c = a ^ c ^ b
3、a ^ a = 0
这样在遍历数组的时候,我们就可以每次的异或上(i + 1)结果 t 就是缺少的那个值
补充:因为和本身的异或结果是 0,所以在 0 - n 中,num[i] 与 i + 1 的结果最后就剩 0 和 目标值了,异或结果是目标值,所以,得出结果。
class Solution {
public int missingNumber(int[] nums) {
int t = 0;
for(int i = 0; i < nums.length; i++) {
t ^= nums[i] ^ (i + 1);
}
return t;
}
}