关闭

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

标签: 刷题位运算
118人阅读 评论(0) 收藏 举报

给定一个整型数组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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10411次
    • 积分:799
    • 等级:
    • 排名:千里之外
    • 原创:72篇
    • 转载:2篇
    • 译文:0篇
    • 评论:1条