题目
题解
方法一:哈希表
建立一个哈希表,以字符为键,以整数为值(初值为0),对于字符串(t)中的每个字符,将哈希表以该字符为键的表项的值加1;然后对于字符串(s)的每个字符,将哈希表中以该字符为键的表项的值减1;如此一来在哈希表中只有以新增字符为键的表项的值大于0,返回该字符。
class Solution {
public:
char findTheDifference(string s, string t) {
unordered_map<char, int> imap;
int len = s.size();
for (int i = 0; i < len; ++i) {
imap[t[i]] += 1;
imap[s[i]] -= 1;
}
imap[t[len]] += 1;
for (int i = 0; i < len+1; ++i) {
if(imap[t[i]] > 0)
return t[i];
}
return ' ';
}
};
方法二:两和之差
使用两个变量sum_s
与sum_t
分别记录字符串(s)与字符串(t)的所有字符的(ASCII)值之和,返回以sum_s
与sum_t
的差值。
class Solution {
public:
char findTheDifference(string s, string t) {
int sum_s = 0, sum_t = 0;
int len = s.size();
for (int i = 0; i < len; ++i) {
sum_s += s[i];
sum_t += t[i];
}
sum_t += t[len];
return char(sum_t - sum_s);
}
};
方法三:位运算
由于字符串(s)与字符串(t)的唯一区别在于新增字符,那么可对两字符串的所有与字符进行异或,最后的结果便是新增字符。这是为什么呢?
自身异或结果为0:ch ^ ch = 0
,并且异或服从交换律:ch1 ^ ch2 ^ ch3
= ch1 ^ ch3 ^ ch2
。
以字符串ab
和字符串abc
来举例,二者所有元素的异或为:a^b^a^b^c
,根据交换律可写成a^a^b^b^c
,根据自身异或结果为0可写成0^c
,其结果为c
,这正是新增的字符。
class Solution {
public:
char findTheDifference(string s, string t) {
int ret = 0;
int len = s.size();
for (int i = 0; i < len; ++i) {
ret = ret ^ s[i] ^ t[i];
}
return ret ^ t[len];
}
};
总结
做完题目后,我去查找“位运算为什么效率更高?”这个问题,我发现:位运算不一定就更比常规的程序执行效率更优,这种“奇技淫巧”编译器会自动给你做了。
https://www.zhihu.com/question/364629487