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

结果

在这里插入图片描述

关于我

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