好久没有刷题了 趁着假期拿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