leetcode 248 有一个数组arr[n-1]存储了1~n中的n-1个数,问arr中缺少的数字是多少

思路:
首先,这个题使用异或(^)来解决。首先了解几个公式:
a ^ a = 0, a ^ b ^ a = b, a ^ b ^ c = a ^ c ^ b
由此,我们可以概括出以下几个结论:
1. 若两个元素相等,则异或结果为0
2. 所有元素与0异或时,结果均不变
3. 异或运算满足交换律

首先,该题是下面的题的变种:

有2n + 1个数,其中有2n个数出现过两次,找出其中只出现一次的数

该题可将所有的值进行异或运算,因为2n个相同的数的异或结果为0,则2n + 1个数的异或结果为只出现一次的数。

来看我们的原题,arr[n - 1]中存了n - 1个数,每个数都是 1 ~ n之间的数,且没有重复。我们用这n - 1个数再加上 1 ~ n 就变成 2n - 1个数。即为上题。

则该算法的时间复杂度为O(n),只用了额外的常数空间,则空间复杂度为O(1)。
代码如下:

    public int getLostNum(int[] arr){
        int n = arr.length + 1;
        int result = 0;
        for(int i = 0; i < n - 1; i++){
            result ^= arr[i];
            result ^=(i + 1);
        }
        result ^= n;
        return result;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值