【刷题之路】寻找奇数次出现的数2

给定一个整型数组arr,其中有两个数出现了奇数次,其他的数都出现了偶数次,找到这两个数。要求时间复杂度为O(N),额外空间复杂度为O(1)。

给定一个整形数组arr及它的大小n,请返回一个数组,其中两个元素为两个出现了奇数次的元素,请将他们按从小到大排列。

与之前不同,这次单数次出现数字为两个,仍然使用位运算,但是因为有两个数,全部异或的结果就是两个单数次异或的结果。比较朴素的想法是将数组分为两组,这样就与之前的问题一致了。

class OddAppearance {
public:
    vector<int> findOdds(vector<int> arr, int n) {
        // write code here
        int temp=0,tmp=0,i,k;
        vector<int> res;
        for(i=0;i<n;i++){
            temp^=arr[i];
        }
        for(i=0;i<sizeof(int)*8;i++){
            k=1<<i;
            if(temp&k) break; //寻找两个数异或之后某一位为1,则这两个数在这一位肯定是不同的,以这个为基准,就可以将数组一分为二
        }
        for(i=0;i<n;i++){
            if(arr[i]&k) tmp^=arr[i]; //将该位值为1的所有数异或,剩下的一定是其中一个单数次出现的值
        }
        temp=temp^tmp; //再次异或,剩下的就是另外一个数字
        if(temp>tmp){
            res.push_back(tmp);
            res.push_back(temp);
        }
        else{
            res.push_back(temp);
            res.push_back(tmp);
        }
        return res;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值