【算法-初级-数组】只出现一次的数字(JavaScript实现)

245 阅读3分钟

【算法-初级-数组】只出现一次的数字(JavaScript实现)

博客说明

文章所涉及的部分资料来自互联网整理,当然还有自己个人的总结和看法,分享的目的在于共建社区和巩固自己。引用的资料如有侵权,请联系本人删除!幸好我在,感谢你来!

算法说明

语言只是实现算法的一种手段,思路才是最为重要的。

如果有多种解法的话,只选一种语言作为解答对比。

如果单独将某一种算法的话,会以多种语言实现,对比语言的特性。

😎因为多对多的话,篇幅会拉的比较大,影响观看体验!

题目

地址

136. 只出现一次的数字

题目说明

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

说明

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1

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

示例 2

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

思路

哈希表

思路

看到重复的元素一下想到了哈希表。将哈希表里面已存在的直接删掉,最后只会保留一个已存在一次的。

JavaScript

注意js在set的取值,通过遍历来获取。

代码

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    const set = new Set();
    const n = nums.length;
    let res;
    for (let i = 0; i < n; i++) {
        if(set.has(nums[i])) {
            set.delete(nums[i])
        } else {
            set.add(nums[i]);
        }
    }
    // js从set中取值
    set.forEach((item) => {
        res = item
    });
    return res;
};

解析

image-20211227191440590

虽然通过了,但是在复杂度上还是需要提高。需要做到不使用额外空间

异或运算

思路

思路就是想破头也没想到,看了一下大佬的,豁然开朗。现把思路复盘一下。

利用异或运算的特性,拆解需求,一个数组只有一个数是和其他数不相等,那么其他数至少出现的次数为2。所以我们可以得出一个可怕😨的结论。整个数组惊醒异或运算的结果就是那一个只出现一次的数。然后遍历数组,循环异或运算就好了。

异或运算的特性

这个很重要!

  • 任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a。
  • 任何数和其自身做异或运算,结果是 0,即 a⊕a=0。
  • 异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。

JavaScript

代码简单的让人不敢相信!

代码

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

效率

效率还不错!

image-20211227194328137

总结

这道题的收获主要是了解异或运算,学会换一种角度思考问题。

感谢

万能的网络

放在LeetCode上的题解

以及勤劳的自己,个人博客GitHub测试GitHub

公众号【归子莫】,小程序【小归博客】

如果你感觉对你有帮助的话,不妨给我点赞👍吧,持续关注也行哈!