异或运算_520这一天,我用异或运算找出人群里的单身狗

博主分享了一道LeetCode上的题目——找出只出现一次的元素。最初打算使用哈希表统计法解决,但题目要求不使用额外空间。在经历了思考和尝试快速排序后,博主发现了异或运算的巧妙解法,仅用两行代码就能在线性时间内解决问题。文章深入介绍了异或运算法则,并以此为关键,解释了如何找到数组中出现一次的元素。
摘要由CSDN通过智能技术生成

v2-621d6a7c6ef144401baf6896b4104b13_1440w.jpg?source=172ae18b

快520了,先送给大家一个视频,戳下方:

e24204373499ffea51b8e3746e1c0266.png
用异或运算找出人群里的单身狗https://www.zhihu.com/video/1245266998344454144

这其实是一道leetcode上面的题目:找出只出现1次的元素

https://leetcode-cn.com/problems/single-number/

df2be42c2dd43e38ea50484f47cf3b78.png

作为一个称职的菜鸟,第一眼看到的时候,第一反应当然是统计大法好。
用字典(哈希表)统计每个元素出现的次数,找出统计次数为1的元素返回,秒杀。
时间复杂度o(n),空间复杂度o(n)。

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        cntdict ={}
        for n in nums:
            cntdict[n] = cntdict.get(n,0) +1
        for n,cnt in cntdict.items():
            if cnt == 1:
                return n

正当我洋洋得意,惊叹于自己的才华和反应速度时,并且准备洗洗睡了时,看到下面的题目要求:

ffabed8ffdba7a978aeb8abc4c6046e5.png


我擦了擦老花镜,怀疑是自己看错的时候,那句:

不使用额外的空间

仿佛在屏幕里裂开了嘴嘲笑我。

我扶了扶老花镜,抓了抓最近有些稀薄的头发,开始了头脑风暴:

668ef5893ea3b991b70dfcf0a6c42cf7.png


不使用额外的空间?
排序?快速排序然后看邻近元素是否有重复?
快速排序时间复杂度O(nlogn),似乎不够优雅....

def singleNumber(self, nums: List[int]) -> int:
		nums = sorted(nums)
		i = 0
		while(i<len(nums)-1):
			if nums[i] == nums[i+1]:
				i+=2
			else:
				return nums[i]
		if i == len(nums)-1:
			return nums[i]

我躺在床上,辗转反侧,开始思考怎样才能不掉发

448a15e3ac5a6e88df51d333e7fb471d.png


不不不,是怎样才能在线性时间内不使用额外的空间找到只出现一次的元素。

我最终还是臣服于自己的智商,点开了题解

什么?异或运算?
两行代码就解决了?

异或运算介绍

异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。
异或运算法则:
1 xor 1=0
0 xor 0=0
1 xor 0=1
0 xor 1=1
即十进制下相同数字异或为1,数字a与0异或结果依然为数字a。
另外有:

  1. a ⊕ a = 0
  2. a ⊕ b = b ⊕ a
  3. a ⊕ b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c
  4. a ⊕ b ⊕ a = b

异或全部的元素?结果就是那个只出现1次的元素?

def singleNumber(self, nums: List[int]) -> int:
		sum = 0
		for n in nums:
			sum^=n
		return sum

我哭了

65a8dc177dcebcd84260ad1dae91ea69.png


几个月后....
恩?leetcode每日一题似乎挺熟悉?
好像有个牛逼的解法?
似乎可以用位运算?
哦...异或嘛,秒杀

我摸了摸自己的地中海,露出了欣慰的笑容

96db4b50c789ae0000e299e09e46e3ea.png

点赞祭奠我逝去的头发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值