389. Find the Difference

两个都是小写字母的字符串s,t;t是s打乱后又加了一个字母的字符串。求加的那个字母。

APPROACH1: 利用map

这题我一开始觉得用一个int/boolean数组模拟的map就好了,记录s里出现过的,t里面没出现过的,但竟然忘记考虑aa这种重复的情况,dumb。
那好像需要两个map?我又想了一下其实也不需要,第二趟遍历t的时候,再toggle回来就好了,比如,用一个boolean数组,第一遍遍历s的时候把出现过的toggle成true,第二遍把t出现过的toggle一遍,那这时候原来是false的那个就会被toggle成true,只要判断
toggle的办法不行,因为s可能有不确定个出现次数的字母。只能用两个map对比了。

APPROACH2: SORT

这个方法蛮清晰的,排序一下对比就好了。

    public char findTheDifference(String s, String t) {
        char c1[] = s.toCharArray();
        char c2[] = t.toCharArray();
        Arrays.sort(c1);
        Arrays.sort(c2);
        for (int i = 0; i < s.length(); i++) {
            if (c1[i] != c2[i]) {
                return c2[i];
            }
        }
        return c2[c2.length - 1];
    }

APPROACH3: BIT MANIPULATION

我还是不够敏感的,当只有一个数不一样的时候,能想到什么?异或啊。跟136题 SINGLE NUMBER一样的解法。

public char findTheDifference(String s, String t) {
    int n = t.length();
    char c = t.charAt(n - 1);
    for (int i = 0; i < n - 1; ++i) {
        c ^= s.charAt(i);
        c ^= t.charAt(i);
    }
    return c;
}

你可能感兴趣的:(389. Find the Difference)