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

关于运算符^问题跪求!

关于运算符^问题跪求!

慕慕森 2019-08-21 20:01:29
题目描述给定一个包含0,1,2,...,n中n个数的序列,找出0..n中没有出现在序列中的那个数。相关代码varmissingNumber=function(nums){varres=nums.length;for(vari=0;i
查看完整描述

2 回答

?
婷婷同学_

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

Bitwise_Operators#(按位异或)
varmissingNumber=function(nums){
varres=nums.length;
for(vari=0;ires=res^(i^nums[i]);
}
returnres;
};
首先异或不需要管顺序。假设数组为连续[1,2...,n]数组,则nums.length必然与数组当中的某个值相等,即n^nums.length为0,因为x^0为x,所以若数据连续,则必然有n-1与上诉过程相同逻辑。
反正就是消消乐的意思,假设nums为[1,2,3]则最后的结果为length异或每个值异或下标,也就是3^1^2^3^0^1^2。
PS:个人不建议使用这样的代码
                            
查看完整回答
反对 回复 2019-08-21
?
饮歌长啸

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

主要是两个性质:
异或满足交换律;
两个bits异或,若相同则为0;若相异则为1。
简化下问题,比如给定数组[0,1,2,3,5],它是少一个4的,现在我们要把4找出来。
(0^1^2^3^4^5)^(0^1^2^3^5)=
(0^0)^(1^1)^(2^2)^(3^3)^(5^5)^4=
0^0^0^0^0^4=
4
就像上面一位朋友说的,消消乐,这个说法形象。
单单针对这道题(老题目了)来说,这个解法应该是最佳的。
在实际项目中,位运算不是不能用,反而是建议你多用,但前提是你,会用,用对,且必须要有注释,没有这三个,还是老实本分点比较好。
基本的位运算,参考https://subetter.com/articles...。
牛逼一点的,参考书籍《算法心得高效算法的奥秘》,此书已快绝版,且异常烧脑。
                            
查看完整回答
反对 回复 2019-08-21
  • 2 回答
  • 0 关注
  • 278 浏览
慕课专栏
更多

添加回答

举报

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