1. 程式人生 > 其它 >677_鍵值對映_2021.11.14

677_鍵值對映_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;
};