在一个数组中找出只出现一次的两个数字,其余数字全部成对出现。

#include <stdio.h>
#include <windows.h>

void findNumber( int a[] , int len){

	int num = 0;
	int pos = 0;
	int x = 0;
	int y = 0;
	int i = 0;

	// 通过异或 求出两个只出现一次的数组元素的 异或的结果
	for (; i < len; i++){
	
		num = num ^ a[i];

		
	}

	// 查找异或结果,二进制第一次出现 1 的位置,
	// 因为两个只出现一次的数组元素时一定不痛的,所以,异或的二进制结果一定含有 1,
	//   通过与1按位& ,求出第一个含有 1 的位置,若没找到,则通过 >> 向右移位的方式 找,找到后,就直接跳出循环。

	for (i = 0; i < 32; i++){
	
		if (1 == ( (num >> i)& 1 ) ) {
			
			
			pos = i;
			break;
		}
	
	
	}

	//  通过所找到的 第一次出现 1的位置pos,对每个数组元素向右移位,
	//   将所有数组元素该位置的二进制数 与 1 相与 ( & ) , 将数组分为两部分
	//   1. 数组元素二进制在该位 为 1 ;       2. 数组元素二进制在该位 为 0;
	//   由于pos记录的是 两个只出现一次的数组元素的 异或的结果二进制 第一次出现1的位置,
	//   在此位置,两个单一数组元素 ,一定 一个为 0 ,一个为 1;
	//   因此通过此操作,两个单一数组元素,一定被分开了,
	//  此时 分别进行异或操作。得出两个只出现一次数组元素的 值。

	for ( i = 0; i < len;i++){
	
		if (1 ==(( a[i] >> pos )& 1  )){
		
			x ^= a[i];
		
		}
		else{
		
			y ^= a[i];
		
		}
	
		
	}
printf("%d %d", x,y);






}

int main()
{
	int arr[] = { 7, 2, 3, 2, 5, 4, 3, 4 };
	int len = sizeof(arr) / sizeof(arr[0]);

	findNumber(arr, len);
	
	system("pause");

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值