题目详情
方法1:转换为数组
将字符串存放到数组中,将t数组减去s数组的元素,得到的就是想要值
python代码的实现
class Solution:
def findTheDifference(self, s: str, t: str) -> str:
s_list = list(s)
t_list = list(t)
for i in s_list:
t_list.remove(i)
return t_list[0]
c++代码实现
C++数组实现,可以考虑哈希表
vector<int> cnt(26, 0); //大小为26 //字符串a的数值最小为96 for (char ch: s) { cnt[ch - 'a']++; //将将"a" 对应 0 b对应1 放到哈希表中 } for (char ch: t) { cnt[ch - 'a']--; //将将"a" 对应 0 b对应1 移除哈希表中 if (cnt[ch - 'a'] < 0) { return ch; //返回此时的字符 } } return ' ';
方法2:转ASIIC
每个字符都会对应这一个专有的ASllC码,可以放入到哈希表中,将两个表相减
得出目标字符的ASIIC码
python中:转ASIIC函数 ord( ) ASIIc转为字符chr()
c++中: 转ASIIC码函数
python代码实现
#转为ASCII码
a_s = 0
a_t = 0
for i in range(len(s)):
i_int = ord(s[i])
a_s += i_int
for i in list(t):
i = ord(i)
a_t += i
return chr(a_t - a_s)
c++代码实现
ASIIC值法:对s的所有字符转为ASIIC值进行累加,然后对t的所有ASSIIC值进行累加,将两个累加值进行相减就是得到的目标字符的ASIIC然后将其转为字符
注:auto关键字 可以自动将i转换为asllc码,同时返回的ascll转为字符
也可以用char
// ASCII值相减法
int a_s =0;
int a_t = 0;
for(auto i:s)
{
a_s += i ;
}
for (auto i : t)
{
a_t += i;
}
return a_t-a_s;
方法3:一些漂亮技巧
利用collections标准库中的couter()
构建一个出现字母的字典,返回字典值最后存续的那个字母即可
代码
时间复杂度:O(n)。遍历计数即可。
空间复杂度:O(1)。只会用到常数个额外空间。class Solution: def findTheDifference(self, s: str, t: str) -> str: return list(Counter(t) - Counter(s))[0]
异或:
相关知识:
一个数和0做XOR运算等于本身:a⊕0 = a
一个数和其本身做XOR运算等于 0:a⊕a = 0
XOR 运算满足交换律和结合律:a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b使用字符(注意不是字符串)异或运算
因为t比s只多了一个字符,故而:两个字符串中相同部分加在一起将是偶数,那个不同的字符加在一起将是奇数。
这不是那个「只有 1 个数字出现了奇数次,其它数字全部出现偶数次,找出出现奇数次的数字」的经典问题嘛,全部异或即可解决!对于字母也是一样的
int ret = 0;
for (char ch: s) {
ret ^= ch;
}
for (char ch: t) {
ret ^= ch;
}
return ret;