剑指offer:面试题40——数组中只出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
要求时间复杂度是O(n),空间复杂度是O(1)。
class Solution {
public:
bool IsBit1(int num,unsigned int indexBit)
{
//判断数在二进制表示中从右边数起的第indexBit位是不是1
num=num>>indexBit;
return(num&1);
}
public:
unsigned int FindFirstBitIs1(int num)
{
//在数的二进制表示中找到最右边是1的位
unsigned int indexBit=0;
while(((num&1)==0)&&(indexBit<8*sizeof(unsigned int)))
{
num=num>>1;
++indexBit;
}
return indexBit;
}
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
//if(data==NULL||data.size()<2) return;
int result=0;
for(int i=0;i<data.size();i++)
{
result^=data[i]; //逐步每一位异或,result得到的结果将是两个非成对数字的异或
}
unsigned int indexOf1=FindFirstBitIs1(result);
*num1=*num2=0;
for(int j=0;j<data.size();j++)
{
if(IsBit1(data[j],indexOf1))
*num1^=data[j]; //子数组中逐个求异或,只有非成对的值最后会被保留下来,其他异或抵消
else
*num2^=data[j];
}
}
};