题目分为以下两种:
目录
1.只有一个单身狗
题目:
一个数组中只有一个数字是出现一次,其他所有数字都出现了两次。
编写一个函数找出这两个只出现一次的数字。
例如:
有数组元素是:1,2,3,4,5,1,2,3,4
只有5出现了一次,我们要找出5
这里有两种解法,第一种是暴力求解法:即遍历数组的每一个元素记录元素的出现次数,出现次数为1次的即为我们要找的目标数字
这里我们详细介绍用异或的方法来寻找单身狗
(1)关于异或
(1)符号:^ 异或是一种二进制的位运算
(2)运算规则:相同为0,相异为1
(3)任何一个整数异或0的结果都为它本身
(4)异或支持交换律:如3^5^3=5 3^3^5=5
通过上面的了解, 可以得知只要把数组的每个元素都异或一次,最后就会得到那个单身狗
分析:
(2)代码实现
#include<stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,1,2,3,4};
int dog = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < sz; i++)
{
dog ^= arr[i];
}
printf("单身狗 是%d", dog);
return 0;
}
2.有两个单身狗
题目:
这道题目依然可以用暴力求解的方法得到答案,但这里我们讨论另外一种方法
(1)分析
第一步:把数组的所有元素都进行异或,最后得到5^6的结果
第二步:
(2)代码实现
#include<stdio.h>
void Find_single_dog(int arr[], int sz, int* px, int* py)
{
int i = 0;
int ret = 0;
//数组元素全部异或在一起
for (i = 0; i < sz; i++)
{
ret ^= arr[i];
}
//计算ret的第几位为1,得到i
int pox = 0;
for (i = 0; i < 32; i++)
{
if (((ret >> pox)&1) == 1)
{
pox == i;
break;
}
}
//分组
for (i = 0; i < sz; i++)
{
if (((arr[i] >> pox )&1)== 1)
{
(*px) ^= arr[i];
}
else
{
(*py) ^= arr[i];
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
int x = 0;
int y = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
Find_single_dog(arr, sz, &x, &y);
printf("单身狗是%d 和%d\n", x, y);
return 0;
}
( 以上代码使用了^,&,| 操作符 来实现代码 )
(注意:这里是使用了返回型参数的方法带回两个值的)