给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入: nums = [2,2,1]
输出: 1
示例 2 :
输入: nums = [4,1,2,1,2]
输出: 4
示例 3 :
输入: nums = [1]
输出: 1
提示:
1 <= nums.length <= 3 * 104-3 * 104 <= nums[i] <= 3 * 104- 除了某个元素只出现一次以外,其余每个元素均出现两次。
题解:
/**
* @description: 哈希表 TC:O(n) SC:O(n)
* @author: JunLiangWang
* @param {*} nums 给定数组
* @return {*}
*/
function hashMap(nums) {
/**
* 该方案采用hashMap的方式,首先遍历一次数组
* 并利用hashMap记录数组元素出现的次数(key为
* 数组元素,value为出现的次数),然后再遍历一
* 次数组,找出hashMap中value为1的元素,则为
* 只出现了一次的元素
*/
// 记录数组元素出现的次数(key为数组元素,value为出现的次数)
let hashMap = new Map();
// 遍历数组元素
nums.forEach((value) => {
// 获得该元素已出现的次数
let count = hashMap.get(value)
// 更新hashMap中该元素出现的次数为count+1
hashMap.set(value, count == undefined ? 1 : ++count)
})
// 遍历数组元素
for (let value of nums) {
// 找出找出hashMap中value为1的元素,则为
// 只出现了一次的元素
if (hashMap.get(value) == 1) return value
}
}
/**
* @description: 位运算 TC:O(n) SC:O(1)
* @author: JunLiangWang
* @param {*} nums 给定数组
* @return {*}
*/
function bitOperations(nums){
/**
* 本方案使用位运算的方式,异或运算有以下三个性质:
* 1.任何数和0做异或运算,结果仍然是原来的数,即 a⊕0=a
* 2.任何数和其自身做异或运算,结果是0,即 a⊕a=0
* 3.异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b
*
* 因此该题我们可通过上述异或运算得出:
* (a1⊕a1)⊕(a2⊕a2)⊕.....⊕(am⊕am)⊕an=an
*
* 因此我们可通过异或运算解决该题
*/
let single=0;
nums.forEach((value)=>{
single^=value
})
return single
}