题目:一个整形数组中出了两个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现了一次的数字,要求时间复杂度为O(n),空间复杂度为O(1)。
用异或知识解答,一个数异或本身结果为0,所以遍历整个数组,数组中所有数组相异或,相同数字相异或相抵消,结果为0,则最后结果为两个不同的数相异或的值。
保存最后所得值,以该值最后一位为标准,将数组分成两组,0一组,1一组,则两个不同的数字被分到不同组,再次将同一组数据相异或,则最后剩下数据为出现一次的数字。
bool IsBit(int num,int index)
{
num>>=index;//右移
return (num&1);
}
void FindNumApperOnce(vector <int> data,int *num1,int *num2)
{
//给定一个数组,首先判断该数组是否为空;
int temp=data[0];
int size=data.size();
if(size<2)
return;
for(int i=0;i<size;i++)
{
temp^=data[i];//数组元素全部异或,最后temp为出现一次的数异或的结果;
}
int index=0;
while((temp&1==0))//判断最后一位是否为0
{
index++;//&运算,全1为0,有0则0;
}
*num1=*num2=0;
while (i<size)
{
if(IsBit(data[i],index))
{
*num1^=data[i];
}
else
{
*num2^=data[i];
}
}
}