前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode,只出现一次的数字

LeetCode,只出现一次的数字

作者头像
微客鸟窝
发布2021-08-18 15:29:09
5810
发布2021-08-18 15:29:09
举报
文章被收录于专栏:Go语言指北

力扣题目:

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

说明:

你的算法应该具有线性时间复杂度。你可以不使用额外空间来实现吗?

  • 来源:力扣(LeetCode)
  • 链接:https://leetcode-cn.com/problems/single-number

解题思路

  1. 暴力破解
  • 遍历一次数组,使用哈希表来存储数组中每个元素出现的次数;
  • 然后再遍历这个哈希表,找到只出现一次的数字
代码语言:javascript
复制
func singleNumber(nums []int) int {
    l := len(nums)
    var re int
    maps := make(map[int]int)
    for i:=0;i<l;i++ {
        maps[nums[i]]++
    }
    for k,v:=range maps{
        if v == 1{
            re = k
            break
        }
    }
    return re
}

题目要求不使用额外空间,上面我们使用了一个额外的哈希表,所以不符合题目要求。

  1. 位运算 对于这道题,我们还可以使用异或运算 ⊕。异或运算有以下三个性质。
  • 任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a。
  • 任何数和其自身做异或运算,结果是 0,即 a⊕a=0。
  • 异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。

因为给定的题目指定,确保是一个非空的数组,且有一个出现一次的元素,其余都会出现两次。使用异或运算,我们将所有元素做异或操作,这样相同的元素会消去,最后剩下独一无二的那个元素。使用异或代码非常简洁,如下:

代码语言:javascript
复制
func singleNumber(nums []int) int {
    for i:=1;i<len(nums);i++ {
        nums[0] ^= nums[i]
    }
    return nums[0]
}

解题中,我们没有使用额外的空间,只使用了题目所提供的数组空间,所以空间复杂度为 O(1)。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微客鸟窝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 力扣题目:
  • 解题思路
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档