找单身狗数

找单身狗数
一个数组中,只有两个数字(定义为num1和num2)是出现了一次,其余的数字都出现了两次,我们要做的就是找出出现了一次的这两个数。

思想:
根据异或运算符的特性:
A(异或)B(异或)A = B;
0 (异或) A = A;
于是,我们可以将这个数组的全部元素依次做异或运算,最终结果就是那个只出现一次的数字。

代码:

```//找单身狗
//一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
#include <stdio.h>
#define SIZE(arr1) sizeof(arr1)/sizeof(arr1[0])
void singledog(int *arr, int len, int *num1, int *num2)
{
	int i;
	int sum = 0;
	for (i = 0; i < len; i++)
	{
		sum ^= *(arr + i);//异或出所有数字
	}
	int j;
	for (j = 0; j < sizeof(int)* 8; j++)//int类型数组的字节数32
	{
		if (((sum >> j) & 1) == 1)//说明sum在右移 j 个单位后,二进制不一样
		{
			break;
		}
	}
	for (i = 0; i < len; i++)
	{
		if (((*(arr + i) >> j) & 1) == 1)
		{
			*num1 ^= (*(arr + i));//异或 j 位置为1的一组数字
		}
		else
		{
			*num2 ^= (*(arr + i));//异或 j 位置为0的一组数字
		}
	}
}
int main()
{
	int arr1[] = { 1, 1, 2, 3, 4, 2, 3, 5, 6, 6 };
	int num1 = 0;
	int num2 = 0;
	singledog(arr1, SIZE(arr1),&num1,&num2);
	printf("%d %d", num1, num2);
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值