寻找单身狗数
方法一:异或求单身狗
原理:相同两数异或为0
把所有数全部异或。
异或的结果找1出现的位置的,然后将所有这个位置为1的数相异或,就是第一个“单身狗”,其他的相异或则是第二个。
void FindDog(int * arr, int n, int * num)
{
int i = 0;
int res = 0;
int pos = 0;
for (i = 0; i < n; ++i)
{
res ^= arr[i];//所有数异或
}
for (i = 0; i < 32; ++i)
{
if (res >> i & 1)//找第一个值为1的位置pos
{
pos = i;
break;
}
}
for (i = 0; i < n; ++i)
{
if (arr[i] & 1 << pos)
num[0] ^= arr[i];//pos为1的所有数相异或的出第一个数
else
num[1] ^= arr[i];//pos为0的所有数相异或的出第二个数
}
}
void main()
{
int num[2] = { 0 };
int arr[] = { 1,2,3,3,4,4,55,55,6,6 };
int sz = sizeof(arr) / sizeof(arr[0]);
FindDog(arr, sz, num);
printf("%d %d", num[0], num[1]);
}
方法二
先排序,然后一一比较
void Bsort(int *arr, int n)//原有数组冒泡排序
{
int i = 0;
int j = 0;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
void FindDog(int *arr, int n,int *num)//
{
Bsort(arr, n);//先排序
int i = 0;
int j = 0;
for (i = 0; i < n;)//遍历排好序的数组
{
if (arr[i] == arr[i + 1])//两数相同,i+2比较下两个数
{
i += 2;
}
else
{
num[j] = arr[i];//两数不同,保存到提前给的数组空间中,i+1继续向后对比
i++;
j++;
}
}
}
void main()
{
int num[2] = {0};
int arr[] = { 1,2,3,3,4,4,55,55,6,6 };
int sz = sizeof(arr) / sizeof(arr[0]);
FindDog(arr, sz, num);
printf("%d %d", num[0], num[1]);
}