//一组数中只有一个数是单个存在的,其他数都是成对的,找到这个数
#include <stdio.h>
int main() {
int arr[13] = { 1,1,2,3,4,2,3,4,5,6,6,8,8 };
//相同的数异或会得0,0与任何数异或都是那个数本身
int len = sizeof(arr) / sizeof(arr[0]);
int ret = 0;
for (int i = 0; i < len; i++) {
ret ^= arr[i];
}
printf("%d\n", ret);
return 0;
}
//一组数中有两个数是单独存在的,找到这两个数
#include <stdio.h>
int main() {
//借助上题的思路,将数组分为两组,这两个数各在一组
//将两个数异或可以得到这两个数二进制位不同的地方
//所以可以借助这一个特点进行分组,按照这两个数二进制位不同的那一位分组
int arr[14] = { 1,1,2,3,4,2,3,4,5,6,6,8,8,9 };
int len = sizeof(arr) / sizeof(arr[0]);
int diff = 0;
for (int i = 0; i < len; i++) {
diff ^= arr[i];
}
int i = 0;
for (i = 0; i < 32; i++) {
if ((diff >> i) & 1 == 1)
break;
}
int x = 0;
int y = 0;
for (int j = 0; j < len; j++) {
if ((arr[j] >> i) & 1 == 1) {
x ^= arr[j];
}
else
y ^= arr[j];
}
printf("%d %d\n", x, y);
return 0;
}
找到数组中不成对的那个数
最新推荐文章于 2024-09-17 09:33:17 发布