目录
1,题目
2,代码
2.1利用map()数据结构
2.2利用Set()数据结构
2.3位运算
3,学习与总结
3.1位运算
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。
勉励自己:贵在坚持!