leetCode 这道题刷的感觉像是玩开心消消乐耶?

283 阅读4分钟

image.png

前言

一时想不开,又打开了力扣,你说刷题吧,好像没啥用,优化来的太快就像龙卷风~~ 离不开暴风圈.....跑题了...不刷吧,又感觉马上就被优化,交不起房租,房东让我滚出去~ 还是看看吧,然后,诶,这个,怎么这么好玩?上题目!balabalabala...

题目 136、只出现一次的数字

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间

示例 1 :

输入: nums = [2,2,1]
输出: 1

示例 2 :

输入: nums = [4,1,2,1,2]
输出: 4

示例 3 :

输入: nums = [1]
输出: 1

提示:

  • 1 <= nums.length <= 3 * 104
  • -3 * 104 <= nums[i] <= 3 * 104
  • 除了某个元素只出现一次以外,其余每个元素均出现两次。

暴力求解

作为一个cv崽,一看题目,哦~~ 完全不懂!但是!不妨碍我用大招,管他什么,先起手一个for循环,纳尼!一个不行,再来一个!先弄出来再说吧,各位,献!丑!啦!如下:

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    // 定义一手长度,待会用
    const l = nums.length;
    // 给结果声明一手变量
    let res = 0;
    // 设定一个包含所有计算的对象
    const repeat = {}
    for(let i = 0;i<l;i++){
        const num = nums[i]
        if(repeat[num]){ // 如果存在,就加1
            repeat[num] = repeat[num]+1
        }else{// 如果不存在 就给到1
            repeat[num] = 1
        }
    }
    for(let key in repeat){//让我康康哪个是1,就是我要找的啦!
        if(repeat[key]==1) res= key
    }
    // 抛出结果
    return res
};

eccbc87e4b5ce2f.gif

企业微信截图_343ed189-b608-430f-b309-c2b8b867e2cd.png

呜呜呜呜😭,先不说符不符合题目给出的复杂度要求,“击败32.83%”js用户深入我心.....

看来,得参考参考大神的解法了(抄....)

异或运算

在JavaScript中,异或运算符用^表示。它需要两个运算数,作为二进制位进行比较。例如,有一个二进制数1010和另一个二进制数1100,它们进行异或运算,得到的结果为0110。
这个位运算,定义是这么定义的:
位运算有下面几个规律
1^1=0;
1^0=1;
0^1=1;
0^0=0;
也就说0和1异或的时候相同的异或结果为0,不同的异或结果为1,根据上面的规律我们得到\
a^a=0;自己和自己异或等于0
a^0=a;任何数字和0异或还等于他自己
a^b^c=a^c^b;异或运算具有交换律

emmm,聪明的同学一定一看就懂,本人就很晕,但是!问题不大,看不明白天书一样的定义,害看不懂代码吗?咱一句一句拆!

首先来个案例[4,1,2,1,2] 再来,起手一个for循环,康康他的成色~

const nums = [4,1,2,1,2];
let result = 0;
for (let i = 0; i < nums.length; i++){
    console.log(result)
    result ^= nums[i];
}
        

image.png

输出分别是0,4,5,7,6,4
这是怎么来的呢?!最后刚刚好,就是我们要的4,我滴唯一~ 拆分开来如下
第一步的 0 不用赘述
第二步 04异或 会返回本身 对应规律: 任何数字和0异或还等于他自己
第三步 41异或 返回54的二进制1001异或一下,个位数,10,结果为1,得到101,就是5啦~
... 那么,计算中的for循环相当于,0^4^1^2^1^204异或,会返回本身,即相当于4^1^2^1^2,其中1^2等于0,就只剩4了,一个一个算等于消消乐 4^1的时候是54^1^274^1^2^1等于消去了1则为64^1^2^1^2则为6消去了2,最后结果为4,就像打扑克中抽乌龟一样,留下最后一个就是乌龟啦~🐢 到此,这代码写起来就是如下:

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    let result = 0;
    for (let i = 0; i < nums.length; i++)
        result ^= nums[i];
    return result;
};

image.png

虽然不像360开机速度一样击败99.99!大神这个解法很好~ 但现在我也会辣!😋

谢谢阅读~如有错误望指正,谢谢