目录
- 1. 单身狗1
- 2. 单身狗2
1. 单身狗1
题目如下:
思路:一部分人可能会使用对数组排序,遍历数组的方式去找出只出现一次的数字,但这种方法的时间复杂度过高,有时候可能会不满足要求。
有一种十分简便的方法是使用异或运算:
代码实现如下:
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,1,2,3,4 };
int num = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < sz; i++)
{
num ^= arr[i];
}
printf("%d\n", num);
return 0;
}
2. 单身狗2
题目如下:
思路:通过上面的题目,我们不难想到,如果我们可以把数组中的数据分离开,再分别进行异或,就可以找出那两个数字。
代码实现如下:
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
int sz = sizeof(arr) / sizeof(arr[0]);
int num = 0;
//1.整体异或,结果就是两个不同数字的异或结果 5^6
for (int i = 0; i < sz; i++)
{
num ^= arr[i];
}
//2.找到5^6倒数第k位为1
int k = 0;
for (int i = 0; i < 32; i++)
{
if (((num>> k) & 1) == 1)
{
k = i;
break;
}
}
//3.根据倒数第k位为1或0,把全部数字分开,再分别异或
int p1 = 0;
int p2 = 0;
for (int i = 0; i < sz; i++)
{
if (((arr[i] >> k) & 1) == 1)
{
p1 ^= arr[i];
}
else
{
p2 ^= arr[i];
}
}
printf("%d %d", p1, p2);
return 0;
}