【Golang】LeetCode-剑指Offer-面试题56 - II-数组中数字出现的次数 II【两种解法】

题目

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。

示例 1:

输入:nums = [3,4,3,3]
输出:4
示例 2:

输入:nums = [9,1,7,9,7,9,7]
输出:1

限制:
1 <= nums.length <= 10000
1 <= nums[i] < 2^31

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof


解题思路

  • hashmap记录
    • 遍历 nums 用 map [ int ] int 记录每个数字出现的数字
    • 遍历 map 输出出现次数为 1 的数字
  • 状态机
    • 与运算符 &
      • 两个操作数中位都为1,结果才为1,否则结果为0
    • 或运算符 |
      • 两个位只要有一个为1,那么结果就是1,否则就为0
    • 非运算符 ~
      • 如果位为0,结果是1,如果位为1,结果是0
    • 异或运算符 ^
      • 两个操作数的位中,相同则结果为0,不同则结果为1
        【Golang】LeetCode-剑指Offer-面试题56 - II-数组中数字出现的次数 II【两种解法】_第1张图片
  • 第一次数字往第一个变量 one 暂存
  • 第二次数字不一样则相加
  • 第三次有一样的抵消掉,暂存数字到第二个变量 two
  • 第四次第一个变量不变,新进的数字与第二个变量抵消,第二变量归零

解法一:hashmap记录

–执行用时:32 ms --内存消耗:6.5 MB

func singleNumber(nums []int) int {
    m := make(map[int]int)
    for _,v := range nums{
        if _,ok := m[v];!ok{
            m[v] = 1
        }else if m[v] < 2{
            m[v] += 1
        }
    }
    n := 0
    for i,v := range m{
        if v == 1{
            n = i
            break
        }
    }
    return n
}

解法二:状态机

–执行用时:28 ms --内存消耗:6.2 MB

func singleNumber(nums []int) int {
    var one,two int
    for _,v := range nums{
        one = ^two&(one^v)
        two = ^one&(two^v)
    }
    return one
}

你可能感兴趣的:(LeetCode力扣个人题解)