单身狗代码的解释:就是只找到出现过一次的数字,而其他的数字都是一对的。(即出现过两次)
现在我们来分析如何实现它:
1.之前我写过关于操作符的^来找到1出现过几次的代码实现
其中之一,有下面代码:
int NumberOf1(int n)
{
int count = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if (((n >> i) & 1) == 1)
{
count++;
}
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
NumberOf1(n);
}
版本1:有一个数组,其中只有一个数字出现1次,其余数字都出现了2次
例如:1 2 3 4 5 1 2 3 4。
其中的原理跟上面也差不多。
但是,现在我们升级一下版本
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
例如: 1 2 3 4 5 1 2 3 4 6
001 -1
010 -2
011 -3
100 -4
101 -5
110 -6
我们可以通过^的方法
0101 -5
0110 -6
按位^
0011 看到里面,如果不是一对(数字不一样的话)的话,它会变成1的
来,再让我们分析一些
举一些数字具体来分析分析
如果有下面数字:
1,2,3,4,5,1,2,3,4,6
我们可以发现除了5,6不是有一对(2个)的,其他都有2个
现在我们来写成每个数字的二进制形式
0001 -1
0010 -2
0011 -3
0100 -4
0101 -5
0110 -6
现在我们看一下最低位的数字规律
1,3,5 二进制最低位都是1
2,4,6 二进制最低位都是0
而且,想要找出单身狗
必须将单身狗放在不同数组,同时剩余数组数字都是成对出现的
才能找
所以,可以分为两个数组:
5 11 33
6 22 44
这样就可以找出5,6是单身狗了
void Find_single_dog(int arr[],int sz,int single_dog[])
{
int i = 0;
int ret = 0;
for (i = 0; i < sz; i++)
{
ret ^= arr[i];
}
//计算二进制中哪一位是1
int p = 0;
for (i = 0; i < 32; i++)
{
if (((ret >> i) & 1 )== 1)
{
p = i;
break;
}
}
for (i = 0; i < sz; i++)
{
if (((arr[i] >> p) & 1) == 1)
{
single_dog[0] ^= arr[i];
}
else
{
single_dog[1] = arr[i];
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,1,2,3,4,5,6,7};
int sz = sizeof(arr) / sizeof(arr[0]);
int single_dog[2]={ 0 };
Find_single_dog(arr, sz, single_dog);
printf("%d %d", single_dog[0], single_dog[1]);
return 0;
}
最后,祝大家幸福........
4593

被折叠的 条评论
为什么被折叠?



