1. 程式人生 > 實用技巧 >2020-12-18 找不同

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