1,位運(yùn)算解決
這題說(shuō)的是字符串t只比s多了一個(gè)字符,其他字符他們的數(shù)量都是一樣的。如果我們把字符串s和t合并就會(huì)發(fā)現(xiàn),除了那個(gè)多出的字符出現(xiàn)奇數(shù)次,其他的所有字符都是出現(xiàn)偶數(shù)次,看到這里我們很容易想到《494,位運(yùn)算解只出現(xiàn)一次的數(shù)字》。所以只要是第494題的解我們都可以拿來(lái)用。
所以這題最簡(jiǎn)單的一種解決方式就是使用異或運(yùn)算,關(guān)于異或運(yùn)算有下面幾個(gè)規(guī)律
a^a=0; 任何數(shù)字和自己異或都是0
a^0=a; 任何數(shù)字和0異或還是他自己
a^b^c=a^c^b 異或運(yùn)算具有交換律
因?yàn)閟和t合并之后,偶數(shù)個(gè)的字符通過(guò)異或都會(huì)變?yōu)?,奇數(shù)個(gè)的字符異或之后還是他自己,我們只需要把合并的字符全部異或一遍即可,代碼如下
public char findTheDifference(String s, String t) {
char[] charArr = s.concat(t).toCharArray();
char res = 0;
for (char c : charArr) {
res ^= c;
}
return res;
}
2,純數(shù)學(xué)的方式解決
既然字符串s比t少一個(gè)字符,我們先統(tǒng)計(jì)字符串s中每個(gè)字符的數(shù)量,然后減去字符串t中的每個(gè)字符,如果小于0,說(shuō)明字符串s比t少的就是這個(gè)字符,直接返回即可,代碼如下
public char findTheDifference(String s, String t) {
int count[] = new int[26];
for (int i = 0; i < s.length(); i++) {
count[s.charAt(i) - 'a']++;
}
for (int i = 0; i < t.length(); i++) {
if (--count[t.charAt(i) - 'a'] < 0)
return t.charAt(i);
}
return 'a';
}
3,使用結(jié)合Set解決
把字符串s和t合并,然后遍歷合并的每個(gè)字符,判斷集合set中是否有這個(gè)字符,如果有就移除,否則就加入到集合set中。最后集合set中只有一個(gè)字符,這個(gè)字符就是我們所求的。
public char findTheDifference(String s, String t) {
Set<Character> set = new HashSet<>();
char[] charArr = s.concat(t).toCharArray();
for (int i = 0; i < charArr.length; i++) {
if (set.contains(charArr[i]))
set.remove(charArr[i]);
else
set.add(charArr[i]);
}
return (char) set.toArray()[0];
}
其實(shí)還可以把contains和add方法合并,如果add失敗,說(shuō)明集合Set中有這個(gè)數(shù)字,然后再把它給移除即可。
public char findTheDifference(String s, String t) {
Set<Character> set = new HashSet<>();
char[] charArr = s.concat(t).toCharArray();
for (int i = 0; i < charArr.length; i++) {
if (!set.add(charArr[i]))
set.remove(charArr[i]);
}
return (char) set.toArray()[0];
}
4,計(jì)算兩個(gè)字符串的差值
還可以用t中所有字符的和減去s中所有字符的和,最后結(jié)果就是要求的那個(gè)字符
public char findTheDifference(String s, String t) {
int distance = 0;
for (int i = 0; i < s.length(); ++i) {
distance -= s.charAt(i);
distance += t.charAt(i);
}
distance += t.charAt(t.length() - 1);
return (char) distance;
}