只出现一次的数字 II
一、LeetCode题解
瞧一瞧(求star!)
- LeetCode题解Javascript版本:Gitbook版本传送门
- LeetCode题解Javascript版本:CSDN传送门
- 前端进阶笔记:Gitbook传送门
二、算法题
题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,3,2]
输出: 3
示例 2:
输入: [0,1,0,1,0,1,99]
输出: 99
解法一 (hash)
思路
- 一个节点同时拥有child和next节点时,我们叫他spec节点
- 保存spec节点的next节点。利用栈,压入栈中
- 用child节点覆盖next节点。
- 向下遍历节点
- 最后在链表尾部以此链接栈顶的节点。
代码
var singleNumber = function(nums) {
var obj = {}
for(let i = 0; i < nums.length; i++){
if(!obj[nums[i]]){
obj[nums[i]] = 1
}else{
obj[nums[i]]++
}
}
for(let key in obj){
if(obj[key] === 1){
return key
}
}
};
结果
解法二(数学思想)
思路
- 利用set存储数组中出现的不重复的数字
[ (a+b+c) * 3 - (a+a+a+b+b+b+c) ] / 2 = c
代码
var singleNumber = function(nums) {
var set = new Set()
for(let i = 0;i < nums.length; i++){
if(!set.has(nums[i])){
set.add(nums[i])
}
}
var sum = nums.reduce( function(prev, cur, index, arr){
return prev + cur
})
var sum1 = 0
for(let key of set.keys()){
sum1 += key*3
}
return (sum1 - sum)/2
};
结果
关于我
- decs: 19年毕业的前端开发一枚,沉迷Js
- E-mail: [email protected]
- 个人博客: CSDN
- GitHub: 传送门