一个整型数组里除了两个数字之外,其它数字都出现了两次。找出这两个数字。时间复杂度O(n),空间复杂度O(1)
1.从头到尾异或数组里面的每一个数字,得到两个数字异或的结果。
2.找到异或结果数第一个不为0的位
3.将数组分为两类,一类就是这一位为1,另一位就是这一位是0的,分别异或得到的结果就是只出现一次的两个数字。
#include<iostream>
using namespace std;
unsigned int FindFirstBit(int num){
int index=0;
while((num&1)==0&&(num<32)){
num=num>>1;
index++;
}
return index;
}
bool isBit(int num,unsigned int index){
num=num>>index;
return(num&1);
}
void FindNumsAppearOnce(int data[],unsigned int len, int &num1, int &num2){
if(len <2){
num1=data[0];
num2=data[1];
return;
}
int resultOR=0;
for(int i=0; i<len; i++)
resultOR ^= data[i];
unsigned int index= FindFirstBit(resultOR);
num1=0,num2=0;
for(int i=0; i<len; i++){
if(isBit(data[i],index))
num1^=data[i];
else
num2^=data[i];
}
}
int main(){
int n=10;
int* data = new int[n];
int num1,num2;
for(int i=0; i<10; i++)
cin>>data[i];
FindNumsAppearOnce(data,n, num1, num2);
cout<<num1<<" "<<num2<<endl;
return 0;
}