找单身狗问题

#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;
}
发布了47 篇原创文章 · 获赞 4 · 访问量 477

猜你喜欢

转载自blog.csdn.net/weixin_45818891/article/details/105032234