一个数组中只有两个数字是出现一次,
其他所有数字都出现了两次。
找出这两个只出现一次的数字,编程实现。
分析:
思路:分成两个数组,每个数组分别异或找出每个数字
1)将整个数组进行异或,
异或的结果就是两个不一样的数字异或的结果。
2)求出异或结果中,从右往左数第pos位为1的下标。
3)将数组以第pos位为1或者不为1分为两个子数组。
4)将两个子数组分别进行异或。
#include<stdio.h>
#include<Windows.h>
void Func(int *arr, int len,int *px, int *py)
{
int i = 0;
int num = 0;
int pos = 0;
for (i = 0; i < len; i++)
{
num ^= arr[i];
}//整体异或的结果存到num中
for (i = 0; i < 32; i++)
{
if (((num >> i) & 1) == 1)
{
pos = i;
break;
}
}//找到了num的从右往左数第pos位为1
for (i = 0; i < len; i++)
{
if (((arr[i] >> pos) & 1) == 1)
{
*px = *px^arr[i];
}
else{
*py = *py ^arr[i];
}
}
}
int main()
{
int arr[] = { 1, 2, 3, 5, 3, 1 };
int len = sizeof(arr) / sizeof(arr[0]);
int x = 0;
int y = 0;
Func(arr, len, &x, &y);
printf("%d,%d\n", x, y);
system("pause");
return 0;
}