c语言练习题3:单身狗升级版(只出现⼀次的数字)

单身狗升级版(只出现⼀次的数字)

根据异或运算的消去律,我们可以将数组中出现次数为偶数的数字消去。

因此,我们可以将数组中所 有数异或起来,得到的结果即为出现次数为奇数的数字异或起来的值。

在得到数组中所有数字的异或结果后,我们还需要根据题意求出两个只出现⼀次的数字的值。可以注 意到,由于这两个数的值必不相同,因此异或数组中的所有值得到的结果⼀定⼤于 0,即两个数⾄少 有⼀位不相同。 

//一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
//编写一个函数找出这两个只出现一次的数字。
//例如:
//有数组的元素是:1,2,3,4,5,1,2,3,4,6
//只有5和6只出现1次,要找出5和6.

//#include<stdio.h>
//int main() {
//	int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int i = 0;
//	int dog = 0;
//	//将原数组全部异或得到由那两个只出现一次数字异或得到的数字
//	for (i = 0; i < sz; i++) {
//		dog ^= arr[i];
//	}
//	int count = 0;
//	//得到新数字中具体他的二进制位中为 1 的那一位
//	for (i = 0; i < 32; i++) {
//		if (((dog >> i) & 1) == 1) {
//			count = i;
//			break;
//		}
//	}
///*按照不同位首先肯定能把这两个结果元素跟分开对吧
//	分成两组,一组第一位是1,一组第一位是0
//	其他的元素怎么分呢,其实无所谓怎么分,因为最后都会a ^ a为0 抵消掉*/
//	int dog1 = 0;
//	int dog2 = 0;
//	for (i = 0; i < sz; i++) {
//		if (((arr[i] >> count) & 1) == 1) {
//			dog1 ^= arr[i];
//		}
//		else {
//			dog2 ^= arr[i];
//		}
//	}
//	printf("%d %d\n", dog1, dog2);
//	return 0;
//}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值