一个数组里,数都是两两出现的,但是有三个数是唯一出现的,找出这三个数。
#include <iostream>
using namespace std;
#define N 3
int getLenOfBinary(int num) {
int len = 0;
while (num) {
num = num >> 1;
len++;
}
return len;
}
int getFirstOne(int hash) {
int index = 0;
while (!(hash & 1 << index)) {
index++;
}
return index;
}
void find2Unique(int* arr, int len, int hash2Nums, int* result) {
int difIndex = getFirstOne(hash2Nums);
int countA = 0;
int countB = 0;
for (int j = 0; j < len; ++j) {
if (arr[j] & 1 << difIndex) {
if (result[0] != arr[j]) {
result[1] ^= arr[j];
countA++;
}
} else {
if (result[0] != arr[j]) {
result[2] ^= arr[j];
countB++;
}
}
}
}
int* find3UniqueNum(int* arr, int len) {
int* result = new int[N];
memset(result, 0, N * sizeof(int));
//记录结果集下标
int index = 0;
//所有数的异或结果
int all = 0;
for (int i = 0; i < len; ++i) {
all ^= arr[i];
}
//二进制长度
int binaryLen = getLenOfBinary(all);
int tempA = 0, tempB = 0;
int countA = 0, countB = 0;
for (int i = 0; i < binaryLen - 1; ++i) {
tempA = 0;
tempB = 0;
countA = 0;
countB = 0;
for (int j = 0; j < len; ++j) {
if (arr[j] & 1 << i) {
tempA ^= arr[j];
countA++;
} else {
tempB ^= arr[j];
countB++;
}
}
if (countA & 1) { //奇数
if (!tempB) { //不包含其他2个唯一数
continue;
} else {
result[index++] = tempA;
all ^= tempA; //从异或结果中去除该数
break;
}
} else {
if (!tempA) {
continue;
} else {
result[index++] = tempB;
all ^= tempB;
break;
}
}
}
find2Unique(arr, len, all, result);
return result;
}