【C】一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次。 找出这两个只出现一次的数字,编程实现。

题目:一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个只出现一次的数字。

例:有数组arr[]={1,2,3,4,5,3,2,1},输出4,5
通过题目可以达成的共识有:
  1. 一定有偶数个数字,且仅有两个数不同其它数成对出现
  2. 整体异或,结果一定是那两个不同数的异或结果。0^任何数->任何数;两个相同的数异或结果为0
  3. 两个不同的数异或结果,一定不为0,将其视作二进制,一定有至少一位为1,该位置上两个数一个为0,一个为1
  4. 用该比特位的不同将数分为两组,每一组都有成对的数和一个单独的数
  5. 组内元素异或完成后,剩下单独的数
代码如下:
#include<stdio.h>
#include<windows.h>
int FindDate(int arr[], int num, int *x, int *y)
{
	int falg = 0;	//用来保存整体异或后的数
	int data = 1;	//检查二进制从后开始的第一个为1的位置
	int i = 0;
	for (i = 0; i < num; i++){			//整体异或
		falg ^= arr[i];
	}
	for (i = 0; i < 32; i++){			//找出第一个为1的位置
		if (falg & (data << i)){
			break;
		}
	}
	data <<= i;							//记录该位置
	for (i = 0; i < num; i++){			//分组并异或
		if (arr[i] & data)
			*x ^= arr[i];
		else
			*y ^= arr[i];
	}
	return 0;
}
int main()
{
	int x = 0, y = 0;
	int arr[50] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 23, 56 };
	int num = sizeof(arr) / sizeof(arr[0]);
	if (0 == FindDate(arr, num, &x, &y)){
		printf("%d,%d\n", x, y);
	}
	system("pause");
}
程序运行结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值