题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
#include<iostream>
using namespace std;
int findFirstBit1(int num){
int indexBit1 = 0;
while((num & 1) == 0 && indexBit1 < 32){
num = num >> 1;
indexBit1++;
}
return indexBit1;
}
bool isBit1(int num, int indexBit1){
num = num >> indexBit1;
return num & 1;
}
void findFirstAppearOne(int *arr, int length, int &num01, int &num02){
if(arr == 0 || length <= 0){
return ;
}
int result = 0;
for(int i=0; i<length; i++){
result ^= arr[i];
}
int indexBit1 = findFirstBit1(result);
for(int j=0; j<length; j++){
if(isBit1(arr[j], indexBit1)){
num01 ^= arr[j];
}else{
num02 ^= arr[j];
}
}
}
int main(){
int arr[8] = {
1, 2, 1, 3, 2, 4, 5, 5
};
int num01 = 0;
int num02 = 0;
findFirstAppearOne(arr, 8, num01, num02);
printf("%d\n", num01);
printf("%d\n", num02);
return 0;
}