两个都是小写字母的字符串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;
}