#面试题#三进制异或

#面试题#数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次。请给出最快的方法,找到x。


分析:

    假设该题目修改为:除了某一个数字x之外,其他数字都出现了两次,而x出现了一次。 则可以把所有数字直接求异或,最终的结果就是x。这个很好理解。

    而该题目是其他数字都出现了三次,可以想到三进制异或运算。其实异或运算的本质就是 求和 % base。 比如 1 ^ 1 = 0  其实就是 (1+1) % 2 = 0。 因此只要按位求和,最后再将每位结果 模除 3,再转换为二进制即是答案x。


代码如下:

#include 
   
   
    
    
using namespace std;
int main() {
    int a[100] = {0};
    int num;
    int i;
    while (cin >> num) {
        i = 0;
        while (num) {
            a[i++] += num & 1;  // the last num of base2 num
            num >>= 1;
        }
    }
    int x = 0;
    for (i = 99; i >= 0; i--) {
        if (a[i] > 0) break; //find the highest position
    }
    for (; i >= 0; i--) {
        if (a[i] % 3 != 0) {
            x += (1<
    
    
   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值