677_鍵值對映_2021.11.14
阿新 • • 發佈:2021-11-14
實現一個 MapSum 類,支援兩個方法,insert和sum:
MapSum() 初始化 MapSum 物件
void insert(String key, int val) 插入 key-val 鍵值對,字串表示鍵 key ,整數表示值 val 。如果鍵 key 已經存在,那麼原來的鍵值對將被替代成新的鍵值對。
int sum(string prefix) 返回所有以該字首 prefix 開頭的鍵 key 的值的總和。
今天的題比較簡單,如果用單純的STL自帶的資料結構,利用unordered_map直接記錄鍵值對,然後在輸出sum的時候利用find函式遍歷unordered_map,pos為0代表找到字首,累加則找到結果:
1 class MapSum { 2 public: 3 MapSum() { 4 mapKstrVint; 5 } 6 7 void insert(string key, int val) { 8 mapKstrVint[key] = val; 9 } 10 11 int sum(string prefix) { 12 13 int sumNum = 0; 14 15 for (auto it = mapKstrVint.begin(); it != mapKstrVint.end(); it++) {16 string tmpKey = it->first; 17 18 if (tmpKey.find(prefix) == 0) { 19 sumNum += it->second; 20 } 21 } 22 23 24 return sumNum; 25 } 26 27 public: 28 unordered_map<string, int> mapKstrVint; 29 };
題解——字首雜湊對映,思路是記錄所有可能的字首子串,同步當前傳入的value,如果後續存在相同的鍵不同的value,則會更新所有的字首所對應的value,如果不存在,則繼續同步
class MapSum1{ public: MapSum1() { } public: void insert(string key, int val) { int delta = val; if (map.count(key)) { delta -= map[key]; } map[key] = delta; for (int i = 1; i < key.size(); i++) { prefixmap[key.substr(0, i)] += delta; } } int sum(string prefix) { return prefixmap[prefix]; } private: unordered_map<string, int> map; unordered_map<string, int> prefixmap; };
題解——字典樹,思路同字首雜湊對映,只是在這一情況下,記錄字首的資料結構是自己實現的(沒看太懂):
// 參考題解(字典樹) struct TrieNode { int val; TrieNode * next[26]; TrieNode() { this->val = 0; for (int i = 0; i < 26; ++i) { this->next[i] = nullptr; } } }; class MapSum2 { public: MapSum2() { this->root = new TrieNode(); } void insert(string key, int val) { int delta = val; if (cnt.count(key)) { delta -= cnt[key]; } cnt[key] = val; TrieNode * node = root; for (auto c : key) { if (node->next[c - 'a'] == nullptr) { node->next[c - 'a'] = new TrieNode(); } node = node->next[c - 'a']; node->val += delta; } } int sum(string prefix) { TrieNode * node = root; for (auto c : prefix) { if (node->next[c - 'a'] == nullptr) { return 0; } else { node = node->next[c - 'a']; } } return node->val; } private: TrieNode * root; unordered_map<string, int> cnt; };