目录
题目地址
原题目
方法一 计数遍历
看到题目首先想到了使用HashMap,key存放字符,value存放出现次数。不过一看“只包含小写字母”,发觉只使用char[26]即可。
class Solution {
public char findTheDifference(String s, String t) {
int[] ret = new int[26];
char[] cs = s.toCharArray();
char[] ct = t.toCharArray();
for(char ch: ct){
ret[ch-'a'] += 1;
}
for(char ch: cs){
ret[ch-'a'] -= 1;
}
for(int i=0;i<26;i++){
if(ret[i]==1){
return (char)(i+(int)'a');
}
}
return ' ';
}
}
复杂度分析
时间复杂度: O(n)。跟字符串长度相关。
空间复杂度: O(1)。只会用到常数个额外空间。
方法二 位运算-异或
将问题转换成求字符串中出现奇数次的字符 =》只出现一次的数字
class Solution {
public char findTheDifference(String s, String t) {
int len = s.length();
// 字符串t 比 s 多一个字符
char c = t.charAt(len);
// ^ 后剩下多余的新增项
for(int i=0;i<len;i++){
c ^= s.charAt(i);
c ^= t.charAt(i);
}
return c;
}
}
复杂度分析
时间复杂度: O(n)。跟字符串长度相关。
空间复杂度: O(1)。只会用到常数个额外空间。
其实刚开始并没有想到用位运算来解决,因为我了解到的位运算和之前做的题目好像给我一种只是数字才适合位运算的感觉,做到这个题才明白 异或运算是根据数据在内存中的二进制数存放形式计算的,字符只是和数字的存放规则不一样而已。