题目

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

说明:

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

示例 1:

  1. 输入: [2, 2, 1]
  2. 输出: 1

示例 2:

输入: [4, 1, 2, 1, 2]
输出: 4

方案一(hash表)

func singleNumber(nums []int) int {
    m := make(map[int]int)
    for _, num := range nums {
        if _, ok := m[num]; !ok {
            m[num] = 1
        } else {
            delete(m, num)
        }
    }

    var key int
    for k, _ := range m {
        key = k
    }
    return key
}
  • 时间复杂度 只出现一次的数字 - 图1
  • 空间复杂度 只出现一次的数字 - 图2

方案二(异或运算)

func singleNumber(nums []int) int {
    var result int
    for _, n := range nums {
        // 异或运算
        result ^= n
    }

    return result
}
  • 时间复杂度 只出现一次的数字 - 图3
  • 空间复杂度 只出现一次的数字 - 图4

方案三(排序)

简述如下(代码略)

时间复杂度:

  1. 先排序输入的数组 只出现一次的数字 - 图5
  2. 遍历找到连续不同的数 只出现一次的数字 - 图6

空间复杂度:

  1. 原地排序算法 只出现一次的数字 - 图7
  2. 遍历找连续不同的数 只出现一次的数字 - 图8

    原文

    https://leetcode-cn.com/explore/learn/card/hash-table/204/practical-application-hash-set/806/