数组中有两种数出现奇数次,其他数出现偶数次,打印奇数次的数

4 篇文章 0 订阅
3 篇文章 0 订阅

一个数组中有两种数出现了奇数次,其他数出现了偶数次,怎么找出打印这两种数

这个问题我们涉及到异或运算 和 怎么将一个数的最右边取出来

有这样一个结论
1.任何数异或0 都为自己本身
2.任何数和自己异或都为0

所以如果有这么一个数组[1,1,2,3,4,4,2,3,2,3,1,1]
我们可以发现2 和 3出现的次数为奇数次
我们将整个数组异或得到的值为 2和3的异或值

00000000 00000000 00000000 00000010
00000000 00000000 00000000 00000011
得到结果为
00000000 00000000 00000000 00000001

我们再将最右边的1取出来可以判定这个属猪可以分为2类
要么00000000 00000000 00000000 00000001 进行& 操作为0的数要么为不为0的数

那么我们就可以写出代码

public static void printOddTimesNum2(int[] arr){
	int eor = 0;
	for(int i=0;i<arr.length;i++){
		eor^=arr[i];
	}
	int Right = eor&((~eor)+1); //取出最右边的值
	int oneAddTimes = 0;
	for(int i=0;i<arr.length;i++){
		if((Right & arr[i])!=0){
			oneAddTimes^=arr[i]; //这里可以得出第一个奇数
		}
	}
	System.out.println(oneAddtimes);
	System.out.println(oneAddtimes^eor);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值