js算法 求惑

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4

运行效率最高的答案

var singleNumber = function(nums) {
    return nums.reduce((acc, num) => acc^num, 0)
};

看不懂为什么一个^能算出值?能解释下运算过程吗?

阅读 2.3k
2 个回答

这是异或运算,即1^0=1 , 1^1=0, 0^0=0。不相同的在一起才是1,相同的在一起为0。这就很好解释了,既然数组里都是成双成对出现,那么他们转换成二进制之后,肯定都是直接抵消为0的,最后只剩下落单的那个元素。因为没有发生位移,所以有办法还原为原来的值

提供一个快速转换成二进制的方法:(Number).toString(2)
比如5的二进制是:(5).toString(2) === '101'
你把这些二进制算出来,然后相互抵消试下

然后就是最后那个0也可以不加,可以少遍历一次

我想,如果你连运算过程都不知道,那得先知道reduce,并知道第二个参数只是初始值,只是在第一次有用。所以[2,2,1]来还原过程就是,0^2 = 2, 2^2=0, 0^1 = 1;so,也许你懂了。如果你连按位异或还不懂,那么我建议你好好读读编程的基础,不然你的进步永远很慢。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题