一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是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;
}
本文介绍了一种高效算法,用于从整型数组中找到仅出现一次的两个数字,其余数字均出现两次。该算法采用位操作实现,确保了时间复杂度为O(n)且空间复杂度为O(1)。
1万+

被折叠的 条评论
为什么被折叠?



