力扣(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;
    }
}

 

posted @ 2019-03-04 20:38  AXiangCoding  阅读(338)  评论(0编辑  收藏  举报