Map Sum Pairs
Implement a MapSum class with insert
, and sum
methods.
For the method, insert,
you'll be given a pair of (string, integer). The string represents the key and the integer represents the value. If the key already existed, then the original key-value pair will be overridden to the new one.
For the method, sum,
you'll be given a string representing the prefix, and you need to return the sum of all the pairs' value whose key starts with the prefix.
Example 1:
Input: insert("apple", 3), Output: Null Input: sum("ap"), Output: 3 Input: insert("app", 2), Output: Null Input: sum("ap"), Output: 5
这题利用Tire, 每次插入数的时候加入一个判断来决定是否需要更新数值,同样的,对于其所在的prefix也需要更新改变。这题代码我是直接用的官网给出的代码,详细资料可以点击这个链接。
import java.util.HashMap;
import java.util.Map;
class MapSum {
class TireNode{
public Map<Character, TireNode> children;
public int score;
public TireNode(){
children = new HashMap<>();
score = 0;
}
}
public HashMap<String, Integer> map;
public TireNode root;
/** Initialize your data structure here. */
public MapSum() {
root = new TireNode();
map = new HashMap<>();
}
public void insert(String key, int val) {
// Get the difference if we reinsert the old key
int delta = val - map.getOrDefault(key, 0);
map.put(key,val);
TireNode root = this.root;
// Update the score
root.score += delta;
//Insert the key
for(char cur : key.toCharArray()){
// when the character does not exist, add new TireNode
root.children.putIfAbsent(cur, new TireNode());
root = root.children.get(cur);
root.score += delta;
}
}
public int sum(String prefix) {
TireNode root = this.root;
for(char cur : prefix.toCharArray()){
root = root.children.get(cur);
if(root == null){
return 0;
}
}
return root.score;
}
}
/**
* Your MapSum object will be instantiated and called as such:
* MapSum obj = new MapSum();
* obj.insert(key,val);
* int param_2 = obj.sum(prefix);
*/