主要思路是:通过异或操作,消除数组中相同的两个数,结果等于不同的两个数的异或,然后找到异或结果中从右往左第一个是1的是第n位,将数组按照第n位是否为1分为两组,分别组内异或,异或的结果几位只出现了一次的那个数。
vs2015中调试运行通过
#include "stdafx.h"
#include<iostream>
using namespace std;
#include<iostream>
using namespace std;
unsigned int FindFirstBitIs1(int num)
{
unsigned int index = 0;
while (((num & 1) == 0) && index < 8 * sizeof(int))
{
num = num >> 1;
++index;
}
return index;
}
{
unsigned int index = 0;
while (((num & 1) == 0) && index < 8 * sizeof(int))
{
num = num >> 1;
++index;
}
return index;
}
bool IsBit1(int num, unsigned int index)
{
num = num >> index;
return (num & 1);
}
void FindNumsAppearOnce(int data[], int len, int *num1, int *num2)
{
if ((NULL == data) || (len < 2))
return;
int resultExclusiveOR = 0;
for (int i = 0; i < len; ++i)
{
resultExclusiveOR ^= data[i];
}
unsigned int indexOf1 = FindFirstBitIs1(resultExclusiveOR);
*num1 = 0;
*num2 = 0;
for (int j = 0; j < len; ++j)
{
if (IsBit1(data[j], indexOf1))
{
*num1 ^= data[j];
}
else
{
*num2 ^= data[j];
}
}
}
{
num = num >> index;
return (num & 1);
}
void FindNumsAppearOnce(int data[], int len, int *num1, int *num2)
{
if ((NULL == data) || (len < 2))
return;
int resultExclusiveOR = 0;
for (int i = 0; i < len; ++i)
{
resultExclusiveOR ^= data[i];
}
unsigned int indexOf1 = FindFirstBitIs1(resultExclusiveOR);
*num1 = 0;
*num2 = 0;
for (int j = 0; j < len; ++j)
{
if (IsBit1(data[j], indexOf1))
{
*num1 ^= data[j];
}
else
{
*num2 ^= data[j];
}
}
}
int main()
{
const int length = 10;
int data[length];
int a = 0;
int b = 0;
for (int i = 0; i < length; i++)
{
cin >> data[i];
}
FindNumsAppearOnce(data, length, &a, &b);
printf("a is %d, b is %d",a,b);
while (1);
return 0;
}