「位运算」leetcode 136.只出现一次的数字(简单)

259 阅读2分钟

这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

一、了解题目

附上原题链接:136. 只出现一次的数字

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

说明:

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

示例 1:

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

示例 2:

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

二、题解分析

首先先分析本题的要求,题目要求是要只有某个元素只出现一次其余元素均出现两次如下列这样子:

singleNumber([1, 2, 1, 2, 3]); // 3
singleNumber([1, 1, 2, 2, 3, 3, 4, 4, 5]); // 5
singleNumber([1, 2, 1, 2, 3, 4, 4, 3, 6]); // 6

了解了要求之后,我们再来看下题意。题意要求线性时间复杂度是 O(n) ,那其实很容易想到使用哈希 Hash 映射来进行计算,遍历一次结束后就能得到结果。但是呢,在空间复杂度上也会达到 O(n) ,这就导致使用较多的额外空间

因此,我们既要满足时间复杂度又要满足空间复杂度,这个时候就要提到位运算中的异或运算 XOR。对于异或运算来说,主要有以下几个特点:

  • 一个数和 0XOR 运算,最终结果等于本身:a⊕0 = a
  • 一个数和其本身做 XOR 运算,最终结果等于 0 :a⊕a = 0
  • XOR 运算满足数学中的交换律结合律:a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b

故而在以上的基础条件上,将所有数字按照顺序做异或运算,最后剩下的结果即为唯一的数字。

三、代码实现

依据上面的题解,我们将用 js 来实现这道题。具体实现代码如下:

/**
 * @description leetcode 136.只出现一次的数字
 */function singleNumber(nums) {
    let ans = 0;
    for(let num of nums) {
        ans ^= num;
    }
    return ans;
}
​
console.log(singleNumber([1, 2, 1, 2, 3])); // 3

从上面的代码中,我们来剖析下整个运算过程。首先 1⊕1=0 ,其次 2⊕2=0 。到最后,3⊕0 ,也就等于 3 了。因此,也就找到了只出现一次的数字。

四、复杂度

最终以上这道题的复杂度为:

  • 时间复杂度→O(n);
  • 空间复杂度→O(1)。

思路来源:只出现一次的数字

以上就是关于 leetcode 136.只出现一次的数字 的题解,不知道对小伙伴们是否有帮助呢?

我们下期见👋👋👋