1.一个数组中只有两个数字是出现一次,
其他所有数字都出现了两次。
找出这两个只出现一次的数字,编程实现。
2、程序
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void findTwoNumber(int *arr, int sz)
{
int ret = 0;
int index = 0;
int num1 = 0;
int num2 = 0;
for (int i = 0; i < sz; i++)
{
ret ^= arr[i];
}
//之所以ret中会出现1,是因为数据不相等,异或得1,则可以说明存在不同数据
//根据不同数据的位置,将数据分为两组,再在每个数据中异或确定最终数据
for (int i = 0; i < 32; i++)
{
//如何得到1的位置,可以右移与1与
if ((ret >> i) & 1 == 1)
{
index = i;
break;
}
}
for (int i = 0; i < sz; ++i)
{
//把每个数据右移index个位置,与1与,可将数据分为两组
//一组第index位为1,一组第index位为0
if (((arr[i] >> index) & 1) == 1)
{
num1 ^= arr[i];
}
else
{
num2 ^= arr[i];
}
}
printf("%d %d\n", num1, num2);
}
int main()
{
int arr[4] = { 1, 2, 3, 2 };
int sz = sizeof(arr) / sizeof(arr[0]);
findTwoNumber(arr, sz);
system("pause");
return 0;
}
3、结果