力扣(LeetCode)找不同 个人题解
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例:
输入: s = "abcd" t = "abcde" 输出: e 解释: 'e' 是那个被添加的字母。
实现拿到题的第一个思路是使用Map进行记录,找到那个被添加的字母,这是普通程序员本能的反应(可能吧,可能只有我比较菜),但是可以想到这个复杂度很高,应该是慢到不可接受。
第二个想法是使用排序对整个字符串进行排序后,比较不同的字母出现的地方,这个也是正常的想法,应该比上面那种办法快一些。
在看了评论区后,发现了一种取巧的做法,借助异或的性质,即一个数和自己进行异或,答案是0,一个数和零进行异或,答案是那个数本身。
这个性质用在这里非常合适,因为可以想到,将两个字符串所有字母进行异或,不用考虑位置,相同的字母异或全部置0,最后多出来的那个数和0异或,得到的是那个数本身,也就是答案。
另外一种做法是,将所有字符的ASCII码加起来,用大的减去小的那个,就是答案。这个方法比较好理解,也不容易出错
摘自评论区:
【笔记】主要是用异或操作(^),抵消重复内容。
- 3 ^ 0 = 3
- 3 ^ 3 = 0
答案如下:
class Solution { public char findTheDifference(String s, String t) { char[] ss = s.toCharArray(); char[] tt = t.toCharArray(); char ans = 0; for (int i = 0; i < ss.length; i++) { ans ^= ss[i]; ans ^= tt[i]; } ans ^= tt[tt.length - 1]; return ans; } }