Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述:
给定两个字符串 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 只包含小写字母
思路分析:
一开始只想到循环,觉着只用循环就太浅显了。 看了评论之后,才知道可以用异或。
在网上可以找到很多关于 异或 的理论。 先上一张 异或 的图(来自网络,侵删)。
即不同时属于两部分的内容为异或。
异或的运算法则
- 归零律: 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)
}
总结:
大学学过异或,学了不会应用也是白搭。
还是需要不断开拓思维的边界,即使自己不会,通过向别人学习也能有所收获。