找单身狗的代码分析

单身狗代码的解释:就是只找到出现过一次的数字,而其他的数字都是一对的。(即出现过两次)

现在我们来分析如何实现它:

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;
}

最后,祝大家幸福........

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值