在阵列中查找偶数次数的三个数字

时间:2014-09-18 07:06:08

标签: algorithm xor

在除三个数字之外的数组中,所有数字都出现奇数次。如何在数组中查找偶数次出现的所有三个数字?

我可以直到我得到所有三个偶数的数字。如何从xor值中获取三个数字?我的方法到现在为止:

#include <iostream>
#include <set>
using namespace std;

int main() {
    // Find the 3 numbers occuring even times in an array
    int arr[] = {1,6,2,88,34,4,98,25,61,7,2,78,2,78,8,25,9,34,56,331};
    int a = arr[0];

    for (int i=1;i<20;i++)
         a ^= arr[i];

    set<int> myset;
    myset.insert(arr,arr+20);
    set<int>::iterator it;
    for (it=myset.begin(); it!=myset.end(); ++it)
        a ^= *it;

    cout<<a<<endl; // a stores xor of the three numbers occuring even number of times, i.e., (25^78^34)=117
    return 0;
}

注意:不应使用Hashtable和排序。解决方案应该在O(n)时间内。

2 个答案:

答案 0 :(得分:0)

您的问题的解决方案是

`
#include <iostream>
#include <set>
using namespace std;

int main() {
    // Find the 3 numbers occuring even times in an array
    int arr[] = {1,6,2,88,34,4,98,25,61,7,2,78,2,78,8,25,9,34,56,331};
    set<int> myset;
set<int> myset_final;


    for (int i=1;i<20;i++)
    {
    if(myset.exists(a[i]))
        myset.remove(a[i]);
    else myset.insert(a[i]);
    }
for(int i=0;i<i<20;i++)
{
    if(!myset.exists(a[i]))
        myset_final.insert(a[i]);
}
    //Now the myset_final contains the numbers that are occured even number of times.
return 0;
}
`

根据我的说法,这是最好的解决方案,但不是O(n)it O(nlog(n))。

答案 1 :(得分:0)

我找到了 this 解决方案,它在 O(n) 时间和 O(1) 空间中完成工作,但唯一的问题是数组的数字可以在 [0,63] 范围内。