在重复3次的数组中查找

http://blog.youkuaiyun.com/Dinosoft/article/details/6443354

一个全是32位整数的大数组,除了其中一个数字出现2次外,其余的数字都出现了3次。如何找出那个只出现了两次的数字?

一个全是32位整数的大数组,除了其中一个数字出现1次外,其余的数字都出现了3次。如何找出那个只出现了1次的数字?


考虑数组元素的某一个位,即bit

在这个位上,其他所有数字在这个位上1的数量是3的倍数

如果在这个位上,特殊值为0,则数组所有数字在这个位上的1的数量之和也是3的倍数

如果在这个位上,特殊值为1,则数组所有数字在这个位上的1的数量之和不是3的倍数

由此可以认为,每一个位上均是做三进制的运算,一旦为3,则这个位要清零

则,最后的数即要查找的数

用两个数组模拟三进制的加法,one表示低位,two表示高位,如果特殊值出现一次,返回one,出现两次,返回two


int special(int a[], int n) {
    int one = 0;
    int two = 0;
    for (int i = 0; i < n; ++i) {
        two |= one & a[i];
        one ^= a[i];
       
        int notThree = ~(one & two);
        one &= notThree;
        two &= notThree;
    }

    return two;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值