寻找单身狗(c语言)

在一个数组中寻找一只出现一次的的数字(单身狗)

当今社会 三人行 必有狗 是谁我不说

数组中也会出现 单身狗数字 

例如数组 1 2 2 3 3 1 4中  4就是单身狗

思路 因为单身狗只有一个 直接全部异或

异或的特点相同为0,相异为1,

如果有重复的数字 异或就等于0 最后只会留一下一个单身狗

看代码

int main()
{
	int arr[] = { 1,2,2,3,3,1,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;
}

但是如果人多起来就不会只有一个单身狗 现在假如有两个单身狗我们该怎么找

如果我们按照之前的思路直接异或 肯定只会出来一个四不像数 

假设数组1 2  3 3 1 4

思路 我们把 两个单身狗分成两个组

而组中其他的数字就都不是单身狗

此时我们在分组异或就分别得到了2个单身狗

问题 我们以什么为依据分组?

依据 二进制位 

异或把相同的数字变成0,不同的数字变成1, 我们根据1在那位 就说明单身狗这个的二进制位不同 ,按照这个二进制位分

两个单身狗是不可能进到一组的

第一步 我们依然把数组中所有数字异或到一起  然后判断这个数字的二进制位 因为有两个单身狗

最后异或完毕得到了 6 6的二进制位是 0110 说明两个单身狗数字的二进制最后位是相等

我们左移一位得到了1 就说明 两个单身狗数字的倒数第二位二进制数 不相等

第二步 让数组中所有的数字左移一位 如果等于 1 放进第一个数组中

如果等于0 放进第二个数组中

第三步 把数组中的数字全部异或就得到了 2个单身狗

直接上代码

int main()
{
	int arr[] = { 1,2,3,3,1,4 };
	int sum = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++)
	{
		sum ^= arr[i];
	}
	int count = 0;
	for (int i = 0; i < 32; i++)
	{
		if (sum & 1 <<i) //循环判断第几位是1
		{
			count = i;//如果是1 记录下来
			break;
		}
	}
	int dog1 = 0, dog2 = 0;
	for (int i = 0; i < sz; i++)
	{
		if ( arr[i] & 1 <<count)
			dog1 ^= arr[i];
		else
			dog2 ^= arr[i];
	}
	printf("第一个单身狗%d\n 第二个单身狗%d", dog1, dog2);
	return 0;
}

  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值