实现一个 MapSum 类里的两个方法,insert 和 sum。
- 对于方法 insert,你将得到一对(字符串,整数)的键值对。字符串表示键,整数表示值。如果键已经存在,那么原来的键值对将被替代成新的键值对。
- 对于方法 sum,你将得到一个表示前缀的字符串,你需要返回所有以该前缀开头的键的值的总和。
示例 1:
输入: insert("apple", 3), 输出: Null
输入: sum("ap"), 输出: 3
输入: insert("app", 2), 输出: Null
输入: sum("ap"), 输出: 5
Java版本实现
package trie;
import java.util.Random;
class MapSum {
private class Node{
int value;
Node[] next = new Node[26];
public Node(int value) {
this.value = value;
}
public Node() {
this(0);
}
}
private Node root;
public static final String ALLCHAR = "abcdefghijkllmnopqrstuvwxyz";
/** Initialize your data structure here. */
public MapSum() {
root = new Node();
}
public void insert(String key, int val) {
Node cur = root;
for(char c : key.toCharArray()) {
if(cur.next[c - 'a'] == null)
cur.next[c - 'a'] = new Node();
cur = cur.next[c - 'a'];
}
cur.value = val;
}
public int sum(String prefix) {
Node cur = root;
for(char c : prefix.toCharArray()) {
if(cur.next[c - 'a'] == null)
return 0;
cur = cur.next[c - 'a'];
}
return sum(cur);
}
private int sum(Node cur) {
int res = cur.value;
for(int i = 0 ; i < cur.next.length ; i ++ ) {
if(cur.next[i] != null)
res += sum(cur.next[i]);
}
return res;
}
public static void main(String[] args) {
int size = 10000;
Random random = new Random();
long startTime = System.nanoTime();
MapSum mapSum = new MapSum();
for(int i = 0 ; i < size ; i ++) {
StringBuffer sb1 = new StringBuffer();
for(int j = 0 ; j < random.nextInt(3) + 7 ; j ++)
sb1.append(ALLCHAR.charAt(random.nextInt(ALLCHAR.length())));
mapSum.insert(sb1.toString(),random.nextInt(size));
}
for(int i = 0 ; i < size ; i ++) {
StringBuffer sb2 = new StringBuffer();
for(int j = 0 ; j < random.nextInt(3) + 7 ; j ++)
sb2.append(ALLCHAR.charAt(random.nextInt(ALLCHAR.length())));
mapSum.sum(sb2.toString());
}
long endTime = System.nanoTime();
System.out.println((endTime - startTime) / 100000000.0 + "ms");
}
}
/**
* Your MapSum object will be instantiated and called as such:
* MapSum obj = new MapSum();
* obj.insert(key,val);
* int param_2 = obj.sum(prefix);
*/