1./找单身狗
//在一个数组中只有两个数字出现一次,其他所以数字都出现了两次
//编写一个函数找出这两个只出现一次的数字
2.方法一:暴力求解,我们用冒泡函数,进行比较如果i==j,那么n++,如果n==1,那么我们将他存储在arr2[],然后我们将arr2[]进行打印,就可以了。
#include<stdio.h>
//方法一;
int main()
{int b = 0;int n = 0;int arr2[2] = { 0 };int arr[ ] = { 0,1,2,3,4,5,0,1,2,3 };int ret = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < ret; i++){int n = 0;for (int j = 0; j < ret; j++){if (arr[i] == arr[j]){n++;}}if (n == 1){arr2[b] = arr[i];b++;}}for (int i = 0; i < b; i++){printf("%d ", arr2[i]);}return 0;
}
3.方法二:
/1.进行分组,如何进行分组
//用按位异或(^)比较二进制的位数,相同等于 0,不同等于 1,
// 因为3^3=0,3^3^5=5,所以可以找到他们单独的数字
//如数组int arr[ ] = { 7,1,2,3,4,5,7,1,2,3 };按位异或就是
//7^1^2^3^4^5^7^1^2^3==7^7^7^1^1^2^2^3^3^4^5==4^5
//4的二进制 0100
//5的二进制 0101
//按位与后为 0001,我们进行取一如果找到了一就出来,如果没有找到n++,
// 不同的数一定能找到一个二进制不同的地方,按位于后为最右边的1
//如果我们找到二进制的第n位为一,我们就可以将4与5分开
#include<stdio.h>
void signle_dog(int arr[], int sz,int *pc, int *pb)
{int pos = 0;int ret = 0;//进行按异或for (int i = 0; i < sz; i++){ret = ret ^ arr[i];}//求出二进制第几位是一for (pos = 0; pos < 32; pos++){if (((ret >> pos) & 1) == 1){break;}}//将他们进行分组for (int j = 0; j < sz; j++){if (((arr[j] >> pos) & 1) == 1){*pc = *pc ^ arr[j];}else{*pb = *pb ^ arr[j];}}}
int main()
{int arr[] = { 0,1,2,3,4,5,0,1,2,3 };int dog1 = 0;int dog2 = 0;int sz = sizeof(arr) / sizeof(arr[0]);signle_dog(arr,sz,&dog1,&dog2);printf("%d %d\n", dog1, dog2);return 0;
}