LeetCode高频100题刷题记录之——只出现一次的数字

1 题目描述

有一个非空整型数组,其中只存在一个只出现一次的数字,其它数字都出现两次,要求在线性时间复杂度下找出这个数字。

2 哈希查找法

这是一个python很好写但是很浪费空间的方法,思想在于遍历所有数字,如果该数字在之前没有出现,那就以其为key,将其添加到字典中;若是已经出现,那就在字典中把这个key删除,最后字典中只会存在一个key,就是没有出现过的那个数字。

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        pre_dict = {}
        for num in nums:
            if num in pre_dict:
                del pre_dict[num]
            else:
                pre_dict[num] = num
        return list(pre_dict.keys())[0]

时间复杂度为 O ( n ) O(n) O(n),空间复杂度较高。

3 按位异或运算法

按位异或⊕(eor)操作的定义如下:

比较两个数值每一位的二进制码,如果某一位相同,则置0,否则置1。

异或以下性质:

异或运算有以下三个性质。

任何数和 00 做异或运算,结果仍然是原来的数,即 a ⊕ 0=a。
任何数和其自身做异或运算,结果是 0,即 a ⊕ a=0。
异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。

因此,只需要把所有的元素进行异或运算,最终得到的结果就是数组中只出现一次的值,因为出现两次的值在进行异或运算之后都变成0了。

思想非常巧妙,这一题考察的就是对按位异或操作的理解,要记住异或的定义。

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        out = 0
        for num in nums:
            out = out ^ num
        return out
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值