题目: 一个数组中,有三个数字只出现一次,其他数字均出现偶数次,求这三个数字。例如 数组为{1,2,3,4,5,6,4,5,6}。三个数字为1,2,3。
我的算法的基本思想是:按位将数组分为两组(采用循环,最多32位,从低位开始,逐一判断数组中的每一个数字),直到两组数据的亦或结果均不为零。这时,这三个数据被分到两组中,奇数个数据的数组的亦或结果为所求的一个数字。
再对另一组数据按位分组,两组的亦或结果为剩余的两个要求的数字。
代码如下:
int A[13] = {1,12,3,4,5,6,7,8,5,6,7,8,4};
int Odd[13],Even[13];
int k =1;
int OddNum =0;
int EvenNum = 0;
int EvenResult = 0;
int OddResult = 0;
int lenth = 13;
for (int i = 0;i<32;i++)
{
OddNum =EvenNum = OddResult = EvenResult = 0;
for (int j = 0;j<lenth;++j)
{
if (A[j]&k)
{
Odd[OddNum++] = A[j];
OddResult = OddResult^A[j];
}
else
{
Even[EvenNum++] = A[j];
EvenResult = EvenResult^A[j];
}
}
if (OddNum != 0 && EvenNum != 0 && OddResult !=0 && EvenResult !=0)
{
if ((OddNum&1) && (EvenNum&1) )
{
cout<<OddResult<<endl;
cout<<EvenResult<<endl;
break;
}
if (OddNum&1)
{
cout<<OddResult<<endl;
for (int l = 0;l<EvenNum;l++)
{
A[l] = Even[l];
lenth = EvenNum;
}
}
else
{
cout<<EvenResult<<endl;
for (int l = 0;l<OddNum;l++)
{
A[l] = Odd[l];
lenth = OddNum;
}
}
}
k = k<<1;
}