/*题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。
**找出这两个数字。要求:时间复杂度是O(n),空间复杂度是O(1)*******
**********************************************************************/
void FindNumAppearOnce(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];//将数组中的每一个数字异或
//找出异或结果的二进制中最右边的1
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];
}
}
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);
}
[剑指offer]面试题40:数组中只出现一次的数字
最新推荐文章于 2022-09-07 23:39:14 发布