只出現一次的數字 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: 傳送門