兩個都是小寫字母的字符串s,t静袖;t是s打亂后又加了一個字母的字符串。求加的那個字母俊扭。
APPROACH1: 利用map
這題我一開始覺得用一個int/boolean數(shù)組模擬的map就好了队橙,記錄s里出現(xiàn)過的,t里面沒出現(xiàn)過的萨惑,但竟然忘記考慮aa這種重復(fù)的情況捐康,dumb。
那好像需要兩個map?我又想了一下其實也不需要庸蔼,第二趟遍歷t的時候解总,再toggle回來就好了,比如姐仅,用一個boolean數(shù)組花枫,第一遍遍歷s的時候把出現(xiàn)過的toggle成true,第二遍把t出現(xiàn)過的toggle一遍掏膏,那這時候原來是false的那個就會被toggle成true劳翰,只要判斷
toggle的辦法不行,因為s可能有不確定個出現(xiàn)次數(shù)的字母馒疹。只能用兩個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
我還是不夠敏感的生均,當(dāng)只有一個數(shù)不一樣的時候,能想到什么腥刹?異或啊马胧。跟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;
}