背景
Leetcode 389. 找不同 (https://leetcode-cn.com/problems/find-the-difference/),
以为用ASCII码值相减已经很快了,没想到还有更骚的——直接异或。。。
附上大神代码,被秀的头皮发麻
class Solution:
def findTheDifference(self, s: str, t: str) -> str:
res = 0
for i in s + t :
res ^= ord(i)
return chr(res)
因为s和t有相同,意味着相同数字的个数必然为偶数,不同数字的个数必然为奇数。
所以这个问题可以转为:如何在一堆”出现次数为偶数“的元素中,找到那个唯一一个”出现次数为奇数“的元素。
启发
以后这种情况都要第一时间想到:异或!
相同为0,不同为1。太骚了,位运算怎么这么牛啊。。。
再来复习下其他位运算:
位运算 | 符号 | 作用 |
---|---|---|
与 | & | 只要有0,必为0 |
或 | | | 只要有1,必然为1 |
异或 | | | 相同为0,不同为1。配合ord()、chr()可用来在一堆”出现次数为偶数“的元素中,找到那个唯一一个”出现次数为奇数“的元素 |
取反 | ~ | |
左移 | << | 二进制1左移,高位丢弃,低位补0。x<<n,相当于x乘上2的n次方。 |
右移 | >> | 二进制1右移,低位丢弃,高位补0。x>>n,相当于x除以2的n次方。 |