题目:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1)。
分析
例如输入数组{2,4,3,6,3,2,5,5},因为只有4、6这两个数字出现一次,其他数字出现了两次,所以输出4、6。
源码
#include<iostream>
using namespace std;
unsigned int FindFirstBitIs1(int num)
{
unsigned int index = 0;
while ((num & 0x1) == 0 && index <= 8 * sizeof(int))
{
num >>= 1;
++index;
}
return index;
}
bool IsBit1(int num, int index)
{
num >>= index;
if ((num & 0x1) == 1)
return true;
else
return false;
}
void FindNumbersAppearOnce(int *arr, int length, int &numA, int &numB)
{
if (arr == nullptr || length <= 1)
return;
int resultOr = 0;
for (int i = 0; i < length; ++i)
resultOr ^= arr[i];
unsigned int indexOf1 = FindFirstBitIs1(resultOr);
numA = numB = 0;
for (int i = 0; i < length; ++i)
{
if (IsBit1(arr[i], indexOf1))
numA ^= arr[i];
else
numB ^= arr[i];
}
}
void test1()
{
cout << "=================test1:nullptr===============" << endl;
int numA = 0;
int numB = 0;
int *arr = nullptr;
FindNumbersAppearOnce(arr, 0, numA, numB);
if (numA == 0 && numB == 0)
cout << "没有找到" << endl;
else
cout << "找到了,numA = " << numA << "\tnumB = " << numB << endl;
}
void test2()
{
cout << "=================test1:{2,4,3,6,3,2,5,5}===============" << endl;
int numA = 0;
int numB = 0;
int arr[] = { 2, 4, 3, 6, 3, 2, 5, 5 };
FindNumbersAppearOnce(arr, sizeof(arr)/sizeof(int), numA, numB);
if (numA == 0 && numB == 0)
cout << "没有找到" << endl;
else
cout << "找到了,numA = " << numA << "\tnumB = " << numB << endl;
}
void test3()
{
//其他的数字出现次数智能是偶数次,否则结果不正确
cout << "=================test1:{4,6,1,1,1,1,1, 1}===============" << endl;
int numA = 0;
int numB = 0;
int arr[] = { 4, 6, 1, 1, 1, 1, 1, 1 };
FindNumbersAppearOnce(arr, sizeof(arr) / sizeof(int), numA, numB);
if (numA == 0 && numB == 0)
cout << "没有找到" << endl;
else
cout << "找到了,numA = " << numA << "\tnumB = " << numB << endl;
}
int main()
{
test1();
cout << endl;
test2();
cout << endl;
test3();
cout << endl;
system("pause");
return 0;
}
=================test1:nullptr===============
没有找到
=================test1:{2,4,3,6,3,2,5,5}===============
找到了,numA = 6 numB = 4
=================test1:{4,6,1,1,1,1,1, 1}===============
找到了,numA = 6 numB = 4
请按任意键继续. . .