目录
1,题目
给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
2,代码
2.1利用map()数据结构
使用 O(n)的空间
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
// 建立哈希表
let hashtable = new Map();
for(let num of nums){
if(!hashtable.has(num)){
hashtable.set(num,1);
}else{
hashtable.set(num,hashtable.get(num)+1);
}
}
for(let [num, count] of hashtable){
if(count === 1){
return num;
}
}
};
2.2利用Set()数据结构
使用 O(n) 的空间
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
// 建立哈希表
let hashtable = new Set();
for(let num of nums){
if(hashtable.has(num)){
hashtable.delete(num);
}else{
hashtable.add(num);
}
}
// 此时 set 中只剩下唯一出现一次的元素,返回它
// 要返回一个数值 不是values()迭代器对象,
// 取其值返回
return hashtable.values().next().value;
};
2.3位运算
数组中的全部元素的异或运算结果即为数组中只出现一次的数字;
时间复杂度:O(n),其中 n是数组长度。只需要对数组遍历一次。
空间复杂度:O(1)
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
let single = 0;
for(let num of nums){
single ^= num;
}
return single;
};
3,学习与总结
3.1位运算
- 第一反应是用hash表,hash表肯定是可以搞定的,但是空间复杂度是 O(n),不满足题意。接着开始思考,如何才能做到空间复杂度是 O(1)呢?
- 异或运算有以下三个性质:作者:力扣官方题解
- 任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a。
- 任何数和其自身做异或运算,结果是 0,即 a⊕a=0。
- 异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。
勉励自己:贵在坚持!