[Leetcode] 260. Single Number III

说实话Single Number II 和 III 都让人感觉到异常的头疼。虽然都是位操作但是方式又不太一样,特别是II。

这一题相对来说,对位操作的要求并非太高。用的和Single Number I一样是基于异或的操作。但是又复杂一些。

首先我们看一下,假设这两个特立独行的数字分别是a和b的话,把所有数字做第一次异或操作,你最后得到的就是a ^ b

从a ^ b之中,我们可以得到a和b之间有哪些bit是不一样的,知道这个,其实就可以把数组的数分成了两组,这些bit我们任意取一个出来就可以了,以这个为区分点,这个bit上为1的是其中一组,为0的是另一组,这样这两组异或出来的结果,就是答案a和b了。
为了方便,可以取least significant bit。取least significant bit 的方法是 lsb = num & ~(num - 1)。给出代码如下:

    public int[] singleNumber(int[] nums) {
        int xor = 0;
        for (int num : nums) {
            xor ^= num;
        }
        
        int lsb = xor & ~(xor - 1);
        int[] result = {0, 0};
        for (int num : nums) {
            if ((num & lsb) == 0) {
                result[0] ^= num;
            } else {
                result[1] ^= num;
            }
        }
        return result;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值