C语言找出数组中的单身狗

如题:

一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。

编写一个函数找出这两个只出现一次的数字。

假设一个数组arr1={1,2,3,4,5,1,2,3,4,6};这个数组中1,2,3,4出现两次,5、6分别出现一次。在C语言中,逻辑或的运算方式是相同为0,相异为1,所以可以先将这这个数组中的元素异或一边,结果是5^6,5的二进制是序列是101,6的二进制序列是110,5^6==101^110=011;异或中出现的1正是出现一次的数异或的结果。按照每位二进制数的最后一位是否为1进行分组。是1的为:1,1,3,3,5 不是1的为2 ,2,4,4,6,在分完组之后,每组依次异或,第一组会得到5,第二组在依次异或,则得到的结果是6(当然,也可以直接与原数组异或后的结果再与分组后异或的结果异或,即5^6^5=6,这样就找出数组中的单身狗了。

具体看代码:

void Find_Single_Dog(int* arr, int sz)
{
	int ret = 0;   //记录数组异或的结果
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		ret ^= arr[i];      //依次异或,最后的结果就是两个单身狗异或的结果
	}
	/*ret=1^1^2^2^3^3^4^4^5^6=5^6=011*/
	//找ret为1的位,以此来分组。
	int pos = 0;
	for (i = 0; i < 31; i++)
	{
		if ((ret >> i) & 1 == 1)
		{
			pos = i;
			break;
		}
	}
 //开始分组,按照每个元素的第pos是否为1开始
	int single1 = 0;//记录第一个单身狗
	int single2 = 0;
	for (i = 0; i < sz; i++)
	{
		if (((arr[i] >> pos) & 1) == 1)
		{
			single1 ^= arr[i];
		}
	}

	single2 = ret ^ single1; //ret= 5^6   single1=5  ret^single1=5^6^5=6,自动找到下一个单身狗
	
	printf("%d,%d", single1, single2);
}
int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	Find_Single_Dog(arr, sz);

	return 0;
}

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开拓的嚣张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值