美文网首页
8_6寻找奇数出现2

8_6寻找奇数出现2

作者: X_Y | 来源:发表于2017-10-23 21:27 被阅读13次

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

    相关文章

      网友评论

          本文标题:8_6寻找奇数出现2

          本文链接:https://www.haomeiwen.com/subject/lllzuxtx.html