在除三个数字之外的数组中,所有数字都出现奇数次。如何在数组中查找偶数次出现的所有三个数字?
我可以直到我得到所有三个偶数的数字。如何从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)时间内。
答案 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] 范围内。