8_6寻找奇数出现2

2017-10-23  本文已影响13人  X_Y

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

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

测试样例:
[1,2,4,4,2,1,3,5],8
返回:[3,5]

class OddAppearance {
    public:
        vector<int> findOdds(vector<int> arr, int n) {
            // write code here
            int diff = arr[0];        
            for(int i=1; i<n; ++i){
                diff ^= arr[i];
            }
            int tmp = diff, num = 0;
            while(tmp != 0){
                if(1 == (tmp & 1)) break;
                tmp >>= 1;
                ++num;
            }
            int a = 0;
            for(int i=0; i<n; ++i){
                if(((arr[i]>>num) & 1) == 1){
                    a ^= arr[i];
                }
            }
            int b = a^diff;
            vector<int> res(2, 0);
            if(a<b){
                res[0] = a;
                res[1] = b;
            }else{
                res[0] = b;
                res[1] = a;
            }
            return res;
        }
};

上一篇 下一篇

猜你喜欢

热点阅读