#include<stdio.h>
#include<stdlib.h>
//一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
//编写一个函数找出这两个只出现一次的数字。
//注意这里是要找两个出现一次的数字
//首先回顾一下怎么找一个出现一次的数字
//我们采用 把所有数字异或在一起 的方法 最终异或得到的结果就是那个出现一次的数字
//原理就是 相同的两个数字按位异或之后会还原 例如 2 ^ 5 ^ 5 = 2
//这里我们应用这样的原理依然可以解出这道题
//思路就是先把所有的数字异或在一起 这个异或的结果就是 那两个数字异或的结果
//然后我们 需要找到这个结果的任意一位是 1 的位
//然后根据 这一位是否为1 来把数组分成两组(这两个数字就会被分配要不同的两组)
//最后两组分别异或就可以得到两个数字
void Findsingle(int arr[], int size, int* num1, int* num2) {
//先吧所有的数字异或在一起
int sum = 0;
for (int i = 0; i < size; i++) {
sum ^= arr[i];
}
//然后要找任意一位为 1 那一位
int pos = 0;
for (; pos < 32; pos++) {
if ((sum & (1 << pos)) != 0) {
break;
}
}
//上面这个循环结束后 就找到了那个为 1 的位
//然后根据这个位是否为 1 吧数组分成两组, 然后分别异或在一起就得到了结果
for (int i = 0; i < size; i++) {
if ((arr[i] & (1 << pos)) == 0) {
//pos 位不为1的一组
*num1 ^= arr[i];
}
else {
//pos 位为1的一组
*num2 ^= arr[i];
}
}
}
int main() {
int arr[] = { 1 , 1 , 2 , 2 , 5 , 7 , 7 , 9 };
int num1 = 0;
int num2 = 0;
int size = sizeof(arr) / sizeof(arr[0]);
//printf("%d\n", size);
Findsingle(arr, size, &num1, &num2);
printf("num1 = %d num2 = %d\n", num1, num2);
system("pause");
return 0;
}
找单身狗问题
猜你喜欢
转载自blog.csdn.net/weixin_45818891/article/details/105032234
今日推荐
周排行