目录
- 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^6for (int i = 0; i < sz; i++){num ^= arr[i];}//2.找到5^6倒数第k位为1int 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;
}