-
以前做过一道题,求出一个数组只出现一次的数字(其他的数字都出现过两次),我们通过异或求出了只出现一次的数字。如果数组中有两个只出现一次的数字,我们还是异或处理。我们知道不同的数字异或一定不为0.因为他们在某一位一定是一个为0,一个为1。那么我们可以把数组按照某一位为1或者0分为两个部分。再分别做异或就求出了只出现一次的两个数字。实现的代码如下:
-
#include
using namespace std;
void getOnlyOne(int intarr[], int length)
{
int sum = intarr[0];
for (int i = 0; i < length; i++)
{
sum = sum^intarr[i];
}
int loc = 1;
while (sum)
{
if (sum & loc)
{
break;
}
loc = loc << 1;
}
int *intarr1 = new int[length];
int *intarr2 = new int[length];
int n1 = 0;
int n2 = 0;
for (int i = 0; i < length; i++)
{
if (intarr[i] & loc)
{
intarr1[n1] = intarr[i];
n1++;
}
else
{
intarr2[n2] = intarr[i];
n2++;
}
}
int wei1 = intarr1[0];
for (int i = 1; i < n1; i++)
{
wei1 = wei1^intarr1[i];
}
cout << wei1 << endl;int wei2 = intarr2[0];
for (int i = 1; i < n2; i++)
{
wei2 = wei2^intarr2[i];
}
cout << wei2 << endl;
}
int main()
{
int intarr[12] = { 1,2,3,4,5,2,3,4,5,1,6,7 };
getOnlyOne(intarr, 12);
system(“pause”);
return 0;
}
执行结果:
6
7
很奇妙的一种思路,位运算相对于加减乘除的效率高了很多,遇到问题可以多考虑位运算。