当先锋百科网

首页 1 2 3 4 5 6 7

数组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;
    }
}