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; }