#include "iostream"
using namespace std;
unsigned int FindFirstBitIs1(int num)
{
int indexBit = 0;
while (((num & 1) == 0) && (indexBit < 8 * sizeof(int)))
{
num = num >> 1;
++indexBit;
}
return indexBit;
}
bool IsBit1(int num, unsigned int indexBit)
{
num = num >> indexBit;
return (num & 1);
}
void FindNumsAppearOnce(int data[], int length, int* num1, int *num2)
{
if (data == NULL || length < 2)
return;
int resultExclusiveOR = 0;
for (int i = 0; i < length; i++)
resultExclusiveOR ^= data[i];
unsigned int indexOf1 = FindFirstBitIs1(resultExclusiveOR);
*num1 = *num2 = 0;
for (int j = 0; j < length;++j)
{
if (IsBit1(data[j],indexOf1))
*num1 ^= data[j];
else
*num2 ^= data[j];
}
}
int main()
{
int a[] = { 2, 4, 3, 6, 3,2,5,5 };
int num1 ,num2;
FindNumsAppearOnce(a, 8, &num1, &num2);
cout << num1 << " " << num2 << endl;
system("pause");
return 0;
}剑指offer面试题40:数组中只出现一次的数字
最新推荐文章于 2026-01-10 14:40:54 发布
本文介绍了一种使用位操作和异或运算来找出数组中仅出现一次的两个整数的方法。通过定义辅助函数来查找整数二进制表示中第一个为1的位,并据此将数组分为两组进行异或运算,最终确定这两个唯一整数。

1711

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



