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_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