题目来源
题目描述
题目解析
使用map
- 用哈希表来建立字符和个数之间的映射,如果在遍历t的时候某个映射值小于0了,那么返回该字符即可
- 不能set,因为字符串中字母可以重复出现
class Solution {
public char findTheDifference(String s, String t) {
HashMap<Character, Integer> map = new HashMap<>();
for (int i = 0; i < s.length(); i++){
map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1);
}
for (int i = 0; i < t.length(); i++){
if (map.containsKey(t.charAt(i)) && map.get(t.charAt(i)) != 0){
map.put(t.charAt(i), map.get(t.charAt(i)) - 1);
}else{
return t.charAt(i);
}
}
return ' ';
}
}
桶计数
只包含小写字母
class Solution {
public char findTheDifference(String s, String t) {
int[] arr = new int[26];
for (int i = 0; i < s.length(); i++){
arr[s.charAt(i) - 'a']++;
}
for (int i = 0; i < t.length(); i++){
arr[t.charAt(i) - 'a']--;
if (arr[t.charAt(i) - 'a'] < 0){
return t.charAt(i);
}
}
return ' ';
}
}
异或
几乎所有的找不同都可以用异或来算:利用异或的性质,相同位返回0,这样相同的字符都抵消了,剩下的就是后加的那个字符
class Solution {
public char findTheDifference(String s, String t) {
int ans = 0;
for (int i = 0; i < s.length(); i++){
ans ^= s.charAt(i);
}
for (int i = 0; i < t.length(); i++){
ans ^= t.charAt(i);
}
return (char)ans;
}
}
优化
class Solution {
public char findTheDifference(String s, String t) {
int ans = 0;
for (int i = 0; i < s.length(); i++){
ans = ans ^ s.charAt(i) ^ t.charAt(i);
}
ans = ans ^ t.charAt(t.length()-1) ;
return (char)ans;
}
}
加减
用加和减,相同的字符一减一加也抵消了,剩下的就是后加的那个字符
class Solution {
public char findTheDifference(String s, String t) {
int ans = 0;
for (int i = 0; i < s.length(); i++){
ans -= s.charAt(i);
}
for (int i = 0; i < t.length(); i++){
ans += t.charAt(i);
}
return (char)ans;
}
}
class Solution {
public char findTheDifference(String s, String t) {
return (char)(Math.abs(sumChar(s) - sumChar(t)));
}
//把char转成数字求和
public int sumChar(String str){
int sum = 0;
for(char c : str.toCharArray()){
sum += (int)c;
}
return sum;
}
}