算法小白必须了解的运算方法 — 异或

106 阅读2分钟

先来看题目:

image.png

看到题目的第一反应,我的想法是暴力解题,用两个循环,代码就不写了,相信这种方法大家肯定都能写的出来,这样做的时间复杂度就是O(n²),很显然不符合题意

第二种是用哈希表,时间复杂度是O(n),这个是符合提议的,代码就暂时略过,因为我们今天的主角不是它

第三种就是按位运算,很多人可能都没听过这个,其实我也没听过,昨天刚刷完这个题目,立马醍醐灌顶,觉得有必要分享给大家尤其是像我这样的算法小白,会让大家有一种新的解题思路。

异或

异或(^):两个相应的二进制位不相同时,结果为1,相同时为0。

异或运算有以下三个性质

1.任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a

1.png 2.任何数和其自身做异或运算,结果是 0,即 a⊕a=0

2.png 3.异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b

3.png

显然我们这道题用的就是异或的性质,题目中说除了那个只出现了一次的数,其余数字都出现两次,那么如果给数组的每一个元素都做异或呢?最后的结果不就是那个只出现了一次的数吗,出现两次的异或结果都为0,最终就是那个出现了一次的数和0做异或,结果就是那个数

代码如下

var singleNumber = function(nums) {
    var s = 0
    for(var i = 0; i < nums.length; i++){
        s = s ^ nums[i]
    }
    return s
};

看到这里是不是有一种开辟了新大路的感觉呢,有就对了,因为昨天我也有!!!