剑指offer:数组中只出现一次的数字

博客介绍了通过异或运算找出数组中只出现一次数字的方法。先对整个数组进行异或操作,保留只出现一次的数字组合结果,再根据结果中倒数第一个1的位置分组,最后对分组后的数组分别进行异或运算得出最终结果。

1=0001 2=0010 3=0011 4=0100 5=0101

  1. 对整个数组进行异或就可以保留只出现一次的数字,例如:
    4^3^2^1^4^3^5^1=2^5=(0010)^(0101)=0111

  2. 0111:根据倒数第一个1确定位置,本次倒数第一个数字是1,所以倒数第一个为1的为一组,为0的为一组

  3. 分成[ 1, 3, 5 ] [ 2, 4 ]
  4. 进行异或:3^1^3^5^1=5, 4^2^4=2,所以结果为2,5

这里写图片描述

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        if(data.empty()) return ;
        int len = data.size(), yihuo = 0;

        for(int i = 0; i < len; i++)
            yihuo ^= data[i];

        *num1 = *num2 = 0;
        for(int i = 0; i < len; i++)
        {
            if(data[i] & yihuo ? false : true)
                *num1 ^= data[i];
            else 
                *num2 ^= data[i];
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值