2020-12-18 找不同

题目


题解

方法一:哈希表

建立一个哈希表,以字符为键,以整数为值(初值为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_ssum_t分别记录字符串(s)与字符串(t)的所有字符的(ASCII)值之和,返回以sum_ssum_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

CS专业在读,热爱编程。
专业之外,喜欢阅读,尤爱哲学、金庸、马尔克斯。
原文地址:https://www.cnblogs.com/jmhwsrr/p/14156776.html