一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
#define N 2
//二进制中第一个1
int getFirstOne(int num) {
int i = 0;
while (!(num & 1 << i)) {
i++;
}
return i;
}
int* find2Unique(int* arr, int len) {
int* result = new int[N];
memset(result, 0, sizeof(int) * len);
int difOr = 0;
for (int i = 0; i < len; ++i) {
difOr ^= arr[i];
}
//第一个1就是2个数二进制中第一个不同的位,可用来分组
int difIndex = getFirstOne(difOr);
for (int i = 0; i < len; ++i) {
if (arr[i] & 1 << difIndex) {
result[0] ^= arr[i];
} else {
result[1] ^= arr[i];
}
}
return result;
}