LeetCode題解:137.只出現一次的數字 II

只出現一次的數字 II

一、LeetCode題解

瞧一瞧(求star!)

二、算法題

題目

給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。

說明:

你的算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 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
};

結果

在這裏插入圖片描述

關於我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章