1、问题
给你一个 非空 整数数组 nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
2、示例
(1)
示例 1 :
输入:nums = [2,2,1]
输出:1
(2)
示例 2 :
输入:nums = [4,1,2,1,2]
输出:4
3、解决思路
方法1
统计数组频次,然后将map转化为数组,通过filter返回其中频次为1的数
方法2
利用异或,因为除了某个元素只出现一次以外,其余每个元素均出现两次,相同的会抵消,不同的那个,如果初始值为0的话,0和不同的那个的结果是不同的那个
(同0,异1,二进制)
4、具体步骤
方法1
(1)统计数组频次
(2)将map转化为数组,通过filter返回其中频次为1的数
方法2
(1)设置结果res的初始值为0,遍历数组
(2)在数组中进行异或,然后将异或结果,赋给res
5、完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>只出现一次的数字</title>
</head>
<body>
<p>
给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。<br />
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
</p>
<p>
<p>
示例 1 :
输入:nums = [2,2,1]
输出:1
</p>
<p>
示例 2 :
输入:nums = [4,1,2,1,2]
输出:4
</p>
<p>
示例 3 :
输入:nums = [1]
输出:1
</p>
</p>
<p>
线性时间复杂度(Linear Time Complexity)的算法在时间上的开销与其处理的输入数据规模成线性关系,即时间复杂度为 O(n),其中 n 是输入数据的大小。以下是几种常见的线性时间复杂度的算法:
</p>
<script>
let nums = [4,1,2,1,2]
singleNumber(nums)
function singleNumber(nums) {
const newMap = new Map()
nums.forEach(item => {
if (newMap.has(item)) {
newMap.set(item,newMap.get(item)+1)
}else{
newMap.set(item,1)
}
});
// console.log(newMap);
const arr = Array.from(newMap.entries())
// console.log(arr);
const res = arr.filter(item => item[1]===1)[0][0]
// console.log(res);
return res
};
</script>
</body>
</html>
6、力扣通过代码
方法1
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
const newMap = new Map()
nums.forEach(item => {
if (newMap.has(item)) {
newMap.set(item,newMap.get(item)+1)
}else{
newMap.set(item,1)
}
});
// console.log(newMap);
const arr = Array.from(newMap.entries())
// console.log(arr);
const res = arr.filter(item => item[1]===1)[0][0]
// console.log(res);
return res
};
方法2
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
// ans被初始化为0。由于异或操作的自反性,任何元素与0异或都等于它本身
let res = 0;
for(const num of nums) {
// console.log(res,num,res^num);
res ^= num;
// console.log(res);
}
return res;
};