力扣136. 只出现一次的数字

98 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情

力扣136. 只出现一次的数字

一、题目描述:

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

示例 1 :

输入:nums = [2,2,1]

输出:1

示例 2 :

输入:nums = [4,1,2,1,2]

输出:4

示例 3 :

输入:nums = [1]

输出:1

提示:

1 <= nums.length <= 3 * 10^4

-3 * 10^4 <= nums[i] <= 3 * 10^4

除了某个元素只出现一次以外,其余每个元素均出现两次。

来源:力扣(LeetCode)

链接:leetcode.cn/problems/si…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    这道题目我的思路很简单,新建一个集合,遍历切片nums,看每一个值是否在集合中出现,如果没有就放入集合,如果在集合中出现就将该值从集合中去掉。因为切片中的元素要么出现2次,要么出现一次,所以当出现第二次时去掉不会出现问题。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    是一次通过的!这道题目还是比较简单的呢!

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    两个相同的数字异或的结果为 0,由于数组中其它元素均出现两次,只有一个元素出现一次,所以可以遍历整个数组,让所有数组元素异或,得到的结果就是只出现一次的那个元素。

    func singleNumber(nums []int) int {
        ans := nums[0]
        for i := 1; i < len(nums); i++ {
            ans ^= nums[i]
        }
        return ans
    }
    

三、AC 代码:

func singleNumber(nums []int) int {
    n_map := make(map[int]int)
    for _,s := range nums{
        if _,ok := n_map[s];!ok{
            n_map[s] = s
        }else{
            delete(n_map,s)
        }
    }
    var s1 int
    for _,s := range n_map{
        s1 = s
    }
    return s1
}

执行用时:20 ms, 在所有 Go 提交中击败了24.58%的用户

内存消耗:6.6 MB, 在所有 Go 提交中击败了7.99%的用户

通过测试用例:61 / 61

四、总结:

这道题目我的解法执行用时和内存消耗都比较大,呜呜呜。

位运算的解法真的是妙极了!

模板来源

作者:掘金酱

链接:juejin.cn/post/706970…

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。