为了账号安全,请及时绑定邮箱和手机立即绑定

js算法 求惑

js算法 求惑

沧海一幻觉 2019-05-19 20:38:54
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。示例1:输入:[2,2,1]输出:1示例2:输入:[4,1,2,1,2]输出:4运行效率最高的答案varsingleNumber=function(nums){returnnums.reduce((acc,num)=>acc^num,0)};看不懂为什么一个^能算出值?能解释下运算过程吗?
查看完整描述

2 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

这是异或运算,即1^0=1,1^1=0,0^0=0。不相同的在一起才是1,相同的在一起为0。这就很好解释了,既然数组里都是成双成对出现,那么他们转换成二进制之后,肯定都是直接抵消为0的,最后只剩下落单的那个元素。因为没有发生位移,所以有办法还原为原来的值
提供一个快速转换成二进制的方法:(Number).toString(2)比如5的二进制是:(5).toString(2)==='101'你把这些二进制算出来,然后相互抵消试下
然后就是最后那个0也可以不加,可以少遍历一次
                            
查看完整回答
反对 回复 2019-05-19
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

我想,如果你连运算过程都不知道,那得先知道reduce,并知道第二个参数只是初始值,只是在第一次有用。所以[2,2,1]来还原过程就是,0^2=2,2^2=0,0^1=1;so,也许你懂了。如果你连按位异或还不懂,那么我建议你好好读读编程的基础,不然你的进步永远很慢。
                            
查看完整回答
反对 回复 2019-05-19
  • 2 回答
  • 0 关注
  • 332 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信