[LeetCode][golang] 异或解题

201 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述:

389. 找不同

给定两个字符串 s 和 t ,它们只包含小写字母。

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

示例 1:

输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。

示例 2:

输入:s = "", t = "y"
输出:"y"

提示:

0 <= s.length <= 1000
t.length == s.length + 1
s 和 t 只包含小写字母

思路分析:

一开始只想到循环,觉着只用循环就太浅显了。 看了评论之后,才知道可以用异或。

在网上可以找到很多关于 异或 的理论。 先上一张 异或 的图(来自网络,侵删)。

image.png

即不同时属于两部分的内容为异或。

异或的运算法则

  • 归零律: A ^ A = 0
  • 恒等律: A ^ 0 = A
  • 交换律: A ^ B = B ^ A
  • 结合律: A ^ B ^ C = A ^ ( B ^ C )= (A ^ B) ^ C
  • 自反: A ^ B ^ A = B
  • D = A ^ B ^ C 可以推出 A = D ^ B ^ C

所以该题的思路是:
两个字符串的所有字节进行异或,最后的结果即为不同的字母。

同样的还适用于其它 在有固定两次重复的值中查找唯一一个无重复的值,或者比较有唯一不同的值的处理。
力扣上也有一些这种类型的题目。如:136. 只出现一次的数字

AC 代码:

golang :

func findTheDifference(s string, t string) byte {
   var result int32

   a := s + t
   for _, v := range a {
      result = result ^ v
   }

   return byte(result)
}

总结:

大学学过异或,学了不会应用也是白搭。
还是需要不断开拓思维的边界,即使自己不会,通过向别人学习也能有所收获。