兩個都是小寫字母的字符串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;
}