知识点
1.先了解异或 ^ 的运算规律,两个数异或相同为0,相异为1。
2.根据异或的运算规律得到:0^a=a,a^a=0。
整体思路
1.先创建一个第三变量tmp,初始化为0;让tmp异或整个数组,最后得到的结果是两个单身狗异或的结果。
2.求出两个单身狗异或的结果的二进制第一位的数字,放到m里面。
3.最后分别把数组的每个元素的第一个二进制位分别异或m。
总体代码
void two_dog(int arr[], int len, int* x, int* y)
{
int n = 0;
for (int i = 0; i < len; i++)
{
n ^= arr[i];/* 两个单身狗的异或后存到n里面 */
}
int m = 0;
for (int i = 0; i < 32; i++)
{
if (((n >> i) & 1) == 1)
{
m = i;
break;
}
}
/* 此时m的值为1 */
for (int i = 0; i < len; i++)
{
if (((arr[i] >> m) & 1) == 1)
{
/* 1-0001 3-0011 5-0101 */
*x ^= arr[i];
}
else
{
/* 2-0010 4-0100 6-1010 */
*y ^= arr[i];
}
}
}
void test6()
{
int x = 0;
int y = 0;
int arr[] = {1,2,3,4,5,1,2,3,4,6};
int len = sizeof(arr) / sizeof(arr[0]);
two_dog(arr,len,&x,&y);
printf("%d,%d\n",x,y);
}
int main()
{
//test1();//奇数再前,偶数再后
//test2();//判断字符串2是不是字符串1旋转过后的字符.
//test3();//计算器
//test4();//杨氏矩阵
//test5();//杨辉三角
test6();//找两个单身狗
return 0;
}