目录
一个数组内所有数字都出现两次,单独出现一次的数字就是单身狗。
例:1,1,2,2,3
单身狗:3
一个单身狗
根据两个相同的数字异或为0,我们可以将数组内所有数字异或,就能找出单身狗。
int main()
{
int arr[] = { 1,2,3,1,2,3,5 };
int dog = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < sz; i++)
{
dog ^= arr[i];
}
printf("%d", dog);
return 0;
}
两个单身狗
当有两个单身狗时,可以将数组分为两组,再进行异或。
如何分组?
先将整个数组进行异或,最后的结果就是两个单身狗异或的结果,再从右向左找出一个该数字二进制为 1 的位,说明两个单身狗的二进制位在该位上是不同的,就可以将该位不同的数分为 2 组。
int main()
{
int arr[] = { 1,2,3,4,1,2,3,5 };
int ret = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int dog1 = 0;
int dog2 = 0;
for (int i = 0; i < sz; i++)
{
ret ^= arr[i];
}
int pos = 0; //记录1在第几位的变量
for (pos = 0; pos < 32; pos++) //找出第几位是 1
{
if ((ret >> pos) & 1)
break;
}
for (int i = 0; i < sz; i++)
{
if ((arr[i] >> pos) & 1) //按照找出的位分组异或
dog1 ^= arr[i];
else
dog2 ^= arr[i];
}
printf("%d %d", dog1, dog2);
return 0;
}