第六十一题(找出数组中两个仅仅出现一次的数字)
题目:一个整型数组里除了两个数字之外,其它的数字都出现了两次。
执行结果:
请敲代码找出这两个仅仅出现一次的数字。
要求时间复杂度是O(n),空间复杂度是O(1)。
思路:先对全部数据进行异或得到结果result,两两同样的数据异或结果为0。因此result为两个仅仅出现1次的数字异或的结果,求得result左边第一个值为1的位,依据异或的性质可知,这两个仅仅出现一次的数字该位上的值肯定不同,一个为0,一个为1。以此为标准。对整个数组中的该位为1的数字进行异或。同样的数字两两消去,得到的结果为该位为1的仅仅出现了一次的数字,同理求得还有一个数字。
C++代码:
#include "stdafx.h"
#include<iostream>
namespace MS100P_61
{
void findTwoSingle(int data[],int length)
{
int result=0;
for (int i = 0; i < length; i++)
result = result^data[i];
int bitIndex;
for (bitIndex = 0; bitIndex < 8 * sizeof(int); bitIndex++)
{
if (result&(1 << bitIndex))
break;
}
result = 0;
for (int i = 0; i < length;i++)
if (data[i] & (1 << bitIndex))
result = result^data[i];
cout << "one number is:" << result << endl;
result = 0;
for (int i = 0; i < length; i++)
if (!(data[i] & (1 << bitIndex)))
result = result^data[i];
cout << "the other is:" << result << endl;
}
void test()
{
int A[] = {3,3,2,2,12,12,7,-1};
findTwoSingle(A, 8);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
MS100P_61::test();
return 0;
}执行结果:

浙公网安备 33010602011771号