剑指offer实践 ——56.2.数组中唯一只出现一次的数字(python版)

本文介绍了如何找到数组中唯一出现一次的数字,提供了三种不同的解题方法:哈希表+队列、位运算以及位运算结合有限状态自动机。通过实例解析和代码展示,详细解释了每种方法的思路和优化点,帮助读者理解数组特性和高效算法的应用。
摘要由CSDN通过智能技术生成



题目

数组中唯一只出现一次的数字
在这里插入图片描述


一、哈希表+队列

简单明了,哈希表+队列

def find_num_appear_once_1(arr):
    if not arr:
        return None

    d = {}
    q = []
    for num in arr:
        if num not in d:
            d[num] = 1
            q.append(num)
        else:
            if d[num] == 1:
                q.remove(num)
            d[num] += 1
    return q[0]

在这里插入图片描述

二、位运算

思考一下数组的性质,除了我们要找的数字,其他数字都出现了3次。假设【3,3,3,5】
3 的二进制 011
3 的二进制 011
3 的二进制 011
5 的二进制 101

对这4个二进制数字分别按位求和:
134
对134按位分别除3取余~
101
真是妙蛙种子吃着妙脆角到了米奇妙妙屋,妙到家了~

def find_num_appear_once_2(arr):
    
    count = [0] * 32 
    for num in arr:
        k = 0
        while k < 32:
            count[k] += num >> k & 1
            k += 1
    res = 0
    for i in range(32):
        res += count[i] % 3 * 2 ** i
    return res

不过这样的实现方式,效率不是很高~
在这里插入图片描述

三、位运算+有限状态自动机

具体思想参考力扣大神的思路:
https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/solution/mian-shi-ti-56-ii-shu-zu-zhong-shu-zi-chu-xian-d-4/

def find_num_appear_once_3(arr):
    ones, twos = 0, 0
    for num in arr:
        ones = ones ^ num & ~twos
        twos = twos ^ num & ~ones
    return ones

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值