关于异或操作和它的算法题

本文介绍了一种利用异或运算的特性来寻找数组中唯一出现一次的数字的方法,并通过扩展这一思想,提出了一种算法来找出在一个数组中除一个数字仅出现一次外其余数字均出现三次的情况下的目标数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先一篇文章推荐:感受异或的神奇,其中介绍了什么是异或,异或的定律:恒等律,归零律,交换律,结合律,以及一些常见用法和一个算法系列。非常好!

这个算法系列指的是:已知一个数组中除了1(2,3)个数字只出现一次,其余都出现2次,如何找到这1(2,3)个数。

这个算法系列的另一种扩展是:已知一个数组中除了1个数字只出现了一次,其余都出现了3次,如何找到这1个数。

解题思路类似:找到一种操作(命名为op),这种操作使得 a op a op a = 0,可以将op看成跟异或具有类似性质的操作。这样的话解题方法就变成了对于所有的元素,执行op操作得到的最终结果就是想要找的数字。

把异或看作是2进制加法不进位操作,则op可以理解为3进制加法不进位操作。但是这种操作不太容易实现,所以换一种思路。找到3个int值,作为32位位组,分别存储出现过1次的位,出现过2次的位,出现过3次的位,遍历数组,去掉出现3次的位,最终出现一次的位就是我们要找的数字。代码如下。

 1 public static int singleNumber(int A[], int n) {
 2     int ones = 0;
 3     int twos = 0;
 4     int threes = 0;
 5     int i = 0;
 6 
 7     for (i = 0; i < n; i++) {
 8         threes = twos & A[i];//目前出现三次的
 9         twos ^= ones & A[i];//得到出现两次的
10         ones ^= A[i];//目前出现一次
11         ones &= ~threes;//去掉出现三次的位
12         twos &= ~threes;//去掉出现三次的位
13     }
14     return ones;
15 }

 

转载于:https://www.cnblogs.com/chen-kh/p/7651394.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值