首先创建一个数组{1,2,3,1,2,3,4,5},其中只出现了一次的数字为4,5。
因为这个数组只有两个元素不同,所以我们可以将整个数组的进行元素异或,假设结果为ret,那么ret就等于这两个只出现过一次的数字进行异或的结果。
因此我们可以知道这两个数哪一位是不同的,然后我们再根据这个不同的二进制位进行分组(该位上为1的分一组,为0的分一组)。
我们任取一组进行异或,其结果就是所求的其中一个数字,将这个数字与ret异或即可求得另一个数字。
void find(int* arr, int sz)
{
int single_1 = 0;
int single_2 = 0;
int* num = arr;
int pos = 0;
for (int n = 0; n < sz ; n++)
{
pos=*(num + n) ^pos;
}
int n = 0;
for (n = 0; n < 32; n++)
{
if (((pos >> n)& 1)==1)
break;
}
for (int i = 0; i < sz; i++)
{
if (((*(arr + i) >> n)&1)==1)
single_1=single_1 ^ (*(arr + i));
}
printf("%d\n", single_1);
single_2 = pos ^ single_1;
printf("%d\n", single_2);
}