1。背景最近遇到一道算法题:找到数组中只出现一次的数。题目描述如下:给定一个非空整数数组,除某个元素只出现一次外,其他元素均出现两次。找到只出现一次的元素注意:你的算法应该具有线性时间复杂度。你能在不使用额外空间的情况下做到吗?例子:输入:[4,1,2,2,1]输出:4没看描述,大聪立马想到用对象来存储数组中出现过的数字,如果再次出现就删除该数字,以及对象中只保留唯一编号。这也是暴力解题的思路之一。话不多说,告诉我你的代码:/***@param{number[]}nums*@return{number}*/constsingleNumber=function(nums){constresult={};for(leti=0;inewNums.length){//num=newNums[i+1];//休息;//}if(newNums[i+1]!==newNums[i+2]){num=newNums[i+1];休息;}}}返回数字;};no不出所料,问题解决了,性能也有所提升:是不是突然觉得自己又在搞事情了!!就在我以为我可以这样交作业的时候,看了看其他同学的解题思路,才发现自己真的很聪明。有一种数学运算符秒解:异或运算第一段代码:/***@param{number[]}nums*@return{number}*/constsingleNumber=function(nums){returnnums.reduce((a,b)=>a^b,0);};你没看错,就是一行代码!!!!更多精彩还在后头,且看表演如何:果然知识匮乏限制了我的想象力。当然还可以有更多牛逼的解题方法,欢迎大家在评论区交流,那我接下来就给大家介绍一下异或运算。2.简介大家熟悉的逻辑运算主要是“与运算”(AND)和“或运算”(OR),还有一个“异或运算”(XOR)也很重要。XOR,是exclusiveOR的缩写,主要用来判断两个值是否相等。XOR通常由插入符号^表示。如果约定0为假,1为真,则异或运算的真值表如下:0^0=0;0^1=1;1^0=1;1^1=0;操作,总是false^x=0;与0的值运算,总是x^0=x本身;交换性x^y=y^x;结合性x^(y^z)=(x^y)^z;3.应用根据以上运算规律,可以得到异或运算的许多重要应用。3.1简化多个值的异或运算,根据运算规律可以简化为:a^b^c^a^b=a^a^b^b^c=0^0^c=c3.2两个交互values一个变量经过三个连续的异或运算,值可以相互交换。让a=1;让b=2;a=a^b;b=a^b;a=a^b;console.log(`a:${a},b:${b}`);//a:2,b:1这是两个变量之间交换值最快的方式,不需要任何额外的空间。也是解决开头数组中只出现一次的数字问题的关键。3.3加密可以采用异或运算进行加密。第一步将明文:text和密钥:key进行异或,可以得到密文:cipherTexttext^key=cipherText;第二步,密文和key再次异或,可以还原成明文cipherText^key=text的原理很简单。如果明文为x,密钥为y,则x和y连续进行两次异或得到自身。(x^y)^y=x^(y^y)=x^0=x3.4数据备份数据备份可采用异或运算。文件x与文件y进行异或以生成备份文件。x^y=z后,无论是文件x还是文件y损坏,只要两个原文件没有同时损坏,都可以根据另一个文件和备份文件恢复。x^z=x^(x^y)=(x^x)^y=0^y=y上面的例子是y被破坏了,x和z异或得到y。4、结语语言工作者要想做好工作,必先利其器。只有不断完善自己的知识体系,才能发现不一样的世界,尊敬!!5.参考链接ThatXORTrick