这是我参与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。对于异或运算来说,主要有以下几个特点:
- 一个数和
0做XOR运算,最终结果等于本身: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.只出现一次的数字 的题解,不知道对小伙伴们是否有帮助呢?
我们下期见👋👋👋