题目描述
给定两个字符串 s 和 t,它们只包含放到小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例 1:
输入:s = “abcd”, t = “abcde”
输出:“e”
解释:‘e’ 是那个被添加的字母。
解题思路
- 思路一
因为上次刚做完使用双HashTable的题目,这个题目就想用两个map
,字符串char当做key,字符出现次数当做value,然后对比形同key的不同value即可。
HashMap<Character, Integer> scharacterIntegerHashMap = new HashMap<> ();
HashMap<Character, Integer> tcharacterIntegerHashMap = new HashMap<> ();
for (int i = 0; i < s.length (); i++) {
String substring = s.substring (i, i + 1);
boolean b = scharacterIntegerHashMap.containsKey (substring.charAt (0));
if (b) {
Integer integer = scharacterIntegerHashMap.get (substring.charAt (0));
scharacterIntegerHashMap.put (substring.charAt (0), integer+1);
}else {
scharacterIntegerHashMap.put (substring.charAt (0), 1);
}
}
for (int i = 0; i < t.length (); i++) {
String substring = t.substring (i, i + 1);
boolean b = tcharacterIntegerHashMap.containsKey (substring.charAt (0));
if (b) {
Integer integer = tcharacterIntegerHashMap.get (substring.charAt (0));
tcharacterIntegerHashMap.put (substring.charAt (0), integer+1);
}else {
tcharacterIntegerHashMap.put (substring.charAt (0), 1);
}
}
Iterator<Map.Entry<Character, Integer>> iterator = tcharacterIntegerHashMap.entrySet ().iterator ();
char diff = 0;
while (iterator.hasNext ()) {
Map.Entry<Character, Integer> next = iterator.next ();
if (scharacterIntegerHashMap.containsKey (next.getKey ())) {
//判断值是否相等
if (scharacterIntegerHashMap.get (next.getKey ())!=next.getValue ()){
diff = next.getKey ();
}
}else {
diff = next.getKey ();
}
}
return diff;
上面是自己做的,然后愉快的提交,结果打败了5%的用户,我想知道这5%的怎么写的!😅
其实在提交的时候就觉得会很烂,但脑子里也没啥其他思路。
- 思路二
官方:首先遍历字符串 s,对其中的每个字符都将计数值加 1;然后遍历字符串 t,对其中的每个字符都将计数值减1。当发现某个字符计数值为负数时,说明该字符在字符串t 中出现的次数大于在字符串s 中出现的次数,因此该字符为被添加的字符
public char findTheDifference(String s, String t) {
int[] cnt = new int[26];
for (int i = 0; i < s.length(); ++i) {
char ch = s.charAt(i);
cnt[ch - 'a']++;
}
for (int i = 0; i < t.length(); ++i) {
char ch = t.charAt(i);
cnt[ch - 'a']--;
if (cnt[ch - 'a'] < 0) {
return ch;
}
}
return ' ';
}
- 思路三:char求和
public char findTheDifference(String s, String t) {
int as = 0, at = 0;
for (int i = 0; i < s.length(); ++i) {
as += s.charAt(i);
}
for (int i = 0; i < t.length(); ++i) {
at += t.charAt(i);
}
return (char) (at - as);
}
思路四:异或位运算
public char findTheDifference(String s, String t) {
int ret = 0;
for (int i = 0; i < s.length(); ++i) {
ret ^= s.charAt(i);
}
for (int i = 0; i < t.length(); ++i) {
ret ^= t.charAt(i);
}
return (char) ret;
}
最让我看不懂的就是第四中解题方式,自己每一步都按照二进制的值求也想不出个所以然来。
最后看的是官方是视频讲解才懂的,异或运算有下面三个特性:
1.任何数和0做异或运算,结果仍然是原来的数
2.任何数和其自身做异或运算,结果是0
3.异或运算满足交换律和结合律
不需要知道每一次的运算结果,如果出现偶数个char做异或运算就是0了,因为两个一样的数字异或运算结果是0,所以最终的异或结果必定是落单的那一个,真的是秒啊!