先来看题目:
看到题目的第一反应,我的想法是暴力解题,用两个循环,代码就不写了,相信这种方法大家肯定都能写的出来,这样做的时间复杂度就是O(n²),很显然不符合题意
第二种是用哈希表,时间复杂度是O(n),这个是符合提议的,代码就暂时略过,因为我们今天的主角不是它
第三种就是按位运算,很多人可能都没听过这个,其实我也没听过,昨天刚刷完这个题目,立马醍醐灌顶,觉得有必要分享给大家尤其是像我这样的算法小白,会让大家有一种新的解题思路。
异或
异或(^):两个相应的二进制位不相同时,结果为1,相同时为0。
异或运算有以下三个性质
1.任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a
2.任何数和其自身做异或运算,结果是 0,即 a⊕a=0
3.异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b
显然我们这道题用的就是异或的性质,题目中说除了那个只出现了一次的数,其余数字都出现两次,那么如果给数组的每一个元素都做异或呢?最后的结果不就是那个只出现了一次的数吗,出现两次的异或结果都为0,最终就是那个出现了一次的数和0做异或,结果就是那个数
代码如下
var singleNumber = function(nums) {
var s = 0
for(var i = 0; i < nums.length; i++){
s = s ^ nums[i]
}
return s
};
看到这里是不是有一种开辟了新大路的感觉呢,有就对了,因为昨天我也有!!!