题目描述
实现一个 MapSum 类里的两个方法,insert
和 sum
。
对于方法 insert
,你将得到一对(字符串,整数)的键值对。字符串表示键,整数表示值。如果键已经存在,那么原来的键值对将被替代成新的键值对。
对于方法 sum
,你将得到一个表示前缀的字符串,你需要返回所有以该前缀开头的键的值的总和。
示例 1:
输入: insert("apple", 3), 输出: Null 输入: sum("ap"), 输出: 3 输入: insert("app", 2), 输出: Null 输入: sum("ap"), 输出: 5
问题分析
创建一个map。insert函数:把字符串和对应的整数存入map,map会按照字典序自动将字符串进行排序。sum函数:用lower_bound函数在map中找到第一个不小于prefix的字符串的位置,然后从此位置开始向后遍历,当遇到的字符串的前缀等于prefix时,将该字符串的映射值加到ans上,然后遍历下一个位置。当遇到字符串的前缀不等于prefix时退出遍历,返回ans。
代码实现
class MapSum {
private:
map<string, int> m;
public:
/** Initialize your data structure here. */
MapSum() {
}
void insert(string key, int val) {
m[key] = val;
}
int sum(string prefix) {
int ans = 0;
int n = prefix.size();
for(auto it = m.lower_bound(prefix); it != m.end() && (*it).first.substr(0, n) == prefix; ++it){
ans += (*it).second;
}
return ans;
}
};
/**
* Your MapSum object will be instantiated and called as such:
* MapSum obj = new MapSum();
* obj.insert(key,val);
* int param_2 = obj.sum(prefix);
*/