389. Find the Difference
Given two strings s and t which consist of only lowercase letters.
String t is generated by random shuffling string s and then add one more letter at a random position.
Find the letter that was added in t.
Example:
Input:
s = "abcd"
t = "abcde"
Output:
e
Explanation:
'e' is the letter that was added.
解法一
维护一个map,s中的每个字符添加字符及字符个数,t中的每个字符出现后,减少字符个数。看哪个字符对应的出现次数等于-1或者在map中不存在,即输出该字符。
public class Solution {
public char findTheDifference(String s, String t) {
char[] sArr = s.toCharArray();
char[] tArr = t.toCharArray();
Map<Character, Integer> map = new HashMap<>();
for (char sa : sArr) {
if (map.containsKey(sa)) {
map.put(sa, map.get(sa) + 1);
} else {
map.put(sa, 1);
}
}
for (char ta : tArr) {
if (map.containsKey(ta)) {
if (map.get(ta) == 0) {
return ta;
}
map.put(ta, map.get(ta) - 1);
} else {
return ta;
}
}
return ' ';
}
}
解法二
异或
public class Solution {
public char findTheDifference(String s, String t) {
char c = 0;
for (int i = 0; i < s.length(); i++) {
c ^= s.charAt(i);
}
for (int j = 0; j < t.length(); j++) {
c ^= t.charAt(j);
}
return c;
}
}
解法三
异或一次循环
public class Solution {
public char findTheDifference(String s, String t) {
char c = t.charAt(t.length() - 1);
for (int i = 0; i < s.length(); i++) {
c ^= s.charAt(i);
c ^= t.charAt(i);
}
return c;
}
}
解法四
字符到int的相互转化
public class Solution {
public char findTheDifference(String s, String t) {
int charS = 0, charT = 0;
for (int i = 0; i < s.length(); i++) {
charS += s.charAt(i);
}
for (int j = 0; j < t.length(); j++) {
charT += t.charAt(j);
}
return (char)(charT - charS);
}
}
解法五
整数与字符转化一次循环
public class Solution {
public char findTheDifference(String s, String t) {
int c = t.charAt(t.length() - 1);
for (int i = 0; i < s.length(); i++) {
c += t.charAt(i);
c -= s.charAt(i);
}
return (char)c;
}
}
解法六
整数数组里存放次数。
int[] alpha = new int[26];
for (int i = 0; i < alpha.length; i++) {
alpha[i] = 0;
}
for (char c : s.toCharArray()) {
alpha[c - 'a']++;
}
for (char c : t.toCharArray()) {
if (--alpha[c - 'a'] < 0) {
return c;
}
}
return 0;