260. Single Number III

来源:互联网 发布:村上作品推荐 知乎 编辑:程序博客网 时间:2024/06/04 19:54

主要思想: 

利用异或的交换律筛选

首先,数组是偶数个(有两个数互不相同,其它数都正好有两个)

考虑 nums = [a1, a2, ... , an]

则其中有两个数x, y互不相同且出现一次, 其它数a,a, b,b, c,c...各出现两次

那么因为x与y互不相同,x与y必定在某个位上的数字不同(x的是0而y的是1 或者 x的是1而y的是0。比如x是(1110)而y是(1010), 那么从左往右第二位x与y不同).

我们要

将数组逐个异或(a1^a2^a3...^an),根据异或的交换律, 得到的结果为(a^a^b^b^c^c^...^x^y) = (0^0^0^...^x^y) = (x^y)

其中一定有一个位为1,那么说明这个位上x与y的值不同.

然后通过检测nums每个数在这个位上为0还是1, 把nums分为两组, 

第一组的每个数字在这个位上为0, 另一组的每个数字在这个位上为1。

这样,我们就把x与y分到了两组, 而每一组都有奇数个, 都由出现两次的数与(x或y)组成。

最后通过

分别将每一组都逐个异或, 同样根据异或的交换律, 相同的数异或得0, 最后这两组的计算结果是x与y,

这样我们就找到了x与y。返回即可。




原创粉丝点击