leetcode--0136--只出现一次的数字

题目要求在一个数组中找出只出现一次的数字,其他元素均出现两次。线性时间复杂度解决方案包括数学方法和哈希表。使用哈希表时,遇到已存在的数字则删除,最后只剩一个数字。若不允许额外空间,可通过异或运算,利用其性质找到唯一数字。给出的两个示例中,输入数组分别[2,2,1]和[4,1,2,1,2],输出结果为1和4。" 75452968,5769093,使用SurfaceView捕获Camera预览并解决闪动问题,"['android', 'camera', 'surfaceView', '视频录制', '屏幕捕获']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:输入: [2,2,1];输出: 1
示例 2:输入: [4,1,2,1,2];输出: 4


解答一:

       首先,如果我们不考虑额外空间的需求的话,这个问题可以有多种解法,比如使用列表操作,但是这种方法比较慢。这里介绍两种方法, 第一个是数学方法:

class Solution:
    def singleNumber(self, nums):
        num_set = list(set(nums))
        s = sum(num_set)
        return 2*s - sum(nums)

       第二,我们还是用哈希表方法来做,找到只出现一次的数据,思路就是如果字典中出现了这个数字,就删除这个数字,最后只剩下了一个只出现一次的数字,然后使用popitem的方法把这个唯一的数字弹出来。

class Solution(object):
    def singleNumber(self, nums):
        hash_table = {}
        for i in nums:
            if i in hash_table:
                hash_table.pop(i)
            else:
                hash_table[i] = 1
        return hash_table.popitem()[0]

解答二

       如果考虑不能使用额外空间的要求的话,我们可以使用异或运算的方法。异或运算满足三种性质:

  1. a^0 = a
  2. a^a = 0
  3. 异或运算满足交换律和结合律

       我们可以这样想,先把出现了两次的相同数据放在最前面,他们进行异或运算就会得到0,最后的数据在与0做异或运算,就会得到唯一的数据本身。

class Solution:
    def singleNumber(self, nums):
        a = 0
        for x in nums:
            a = a ^ x
        return a

最后放一下运行结果:

方法消耗时间消耗空间
列表操作1864ms16.4MB
数学方法248ms16.8MB
哈希表(字典)204ms16.2MB
异或方法128ms16.2MB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值