leetcode 136 只出现一次的数字

好久没有刷题了 趁着假期拿leetcode练练手 找找手感 正好也可以练练Python

一开始都是以简单的暴力题为主

然后看到了leetcode这个题

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

说明:

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

示例 1:

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

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

这道题很简单 暴力找一下非空元素即可

只不过需注意不要额外用一些空间 按照我的理解就是不能用桶计数

我看到网上的一个题解 我觉得这个思路很棒 因此想为这道题写一篇博客

这个方法是用的异或运算 即两个数由十进制转化为二进制 按位异或

相同取0 不同取1

当我们平时在练习异或运算时 我们会发现

两个数相同的时候 异或运算结果为0 一个值和0进行按位异或操作所得为该值

我们根据这个原理再来看这道题

由于每个重复元素重复两次 所以无论他们出现的位置如何 最终都会相互抵消异或为0

而唯一元素只出现一次 与0异或结果为自身 最后会得到保留

因此 我们可以直接设定一个中间变量result 初始值为0

将数组中元素依次与中间变量进行异或运算

当出现唯一的元素时 经过遍历之后 最后会筛选出来得到保留 这就是我们想要的结果

Python代码如下

class Solution:
    def singleNumber(self, nums: list[int]) -> int:
        result = int(0)
        for item in nums:
            result ^= item
        return result

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值