LeetCode 677. Map Sum Pairs 键值映射(C++/Java)

题目:

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

分析:

实现一个MapSum类,拥有insert和sum两个方法。

对于方法 insert,你将得到一对(字符串,整数)的键值对。字符串表示键,整数表示值。如果键已经存在,那么原来的键值对将被替代成新的键值对。

对于方法 sum,你将得到一个表示前缀的字符串,你需要返回所有以该前缀开头的键的值的总和。

使用一个map用来存储键值对,每当insert一个字符串时,将这个字符串的所有前缀和val保存到另一个map中,同时插入字符串时,如果map中已经有这个这个前缀的话,就需要更新值。

例如原来插入一个apple-3,此时保存前缀的map中保存a-3,ap-3,app-3,appl-3,apple-3。如果再新插入一个ape-2,我们就要将a-3更新成为a-5,ap-3更新为ap-5,同时新加一个ape-2,也就是将原来的值和新的前缀值相加。

程序:

C++

class MapSum {
public:
    /** Initialize your data structure here. */
    MapSum() {

    }

    void insert(string key, int val) {
        int diff = val - vals[key];
        for(int i = 1; i <= key.size(); ++i){
            sums[key.substr(0, i)] += diff;
        }
        vals[key] = val;
    }

    int sum(string prefix) {
        return sums[prefix];
    }
private:
    map<string, int> vals;
    map<string, int> sums;
};

Java

class MapSum {

    /** Initialize your data structure here. */
    public MapSum() {

    }

    public void insert(String key, int val) {
        int diff = val - vals.getOrDefault(key, 0);
        for(int i = 1; i <= key.length(); ++i){
            String s = key.substring(0, i);
            sums.put(s, sums.getOrDefault(s, 0) + diff);
        }
        vals.put(key, val);
    }

    public int sum(String prefix) {
        return sums.getOrDefault(prefix, 0);
    }
    private HashMap<String, Integer> vals = new HashMap<>();
    private HashMap<String, Integer> sums = new HashMap<>();
}

原文地址:https://www.cnblogs.com/silentteller/p/12293371.html

时间: 2024-10-06 03:54:31

LeetCode 677. Map Sum Pairs 键值映射(C++/Java)的相关文章

leetcode 677. Map Sum Pairs

使用前缀树 function Node() { this.value = 0 this.children = {} } class MapSum { constructor() { this.root = new Node() } insert(word, val) { var node = this.root; for (let next of word) { if (!node.children[next]) { node.children[next] = new Node() } node

LC 677. 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 pai

Java记录 -63- Java的键值映射Map

public interface Map<K,V> 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. Map接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口. Map 接口提供三种collection 视图,允许以键集.值集或键-值映射关系集的形式查看某个映射的内容.映射顺序 定义为迭代器在映射的 collection 视图上返回其元素的顺序.某些映射实现可明确保证其顺序,如 TreeMap 类:另一些映射实现则不保证顺序,如 HashMap 

Android : 输入设备键值映射流程

一.Android输入子系统简介: Android输入事件的源头是位于/dev/input/下的设备节点,而输入系统的终点是由WMS管理的某个窗口.最初的输入事件为内核生成的原始事件,而最终交付给窗口的则是KeyEvent或MotionEvent对象.因此Android输入系统的主要工作是读取设备节点中的原始事件,将其加工封装,然后派发给一个特定的窗口以及窗口中的控件.这个过程由InputManagerService(以下简称IMS)系统服务为核心的多个参与者共同完成. 图1:输入系统的总体流程

【Java必修课】通过Value获取Map中的键值Key的四种方法

1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value值,求Key值. 本文将用实例介绍四种方法,通过传入Value值,获取得到Key值. 2 四种方法 2.1 循环法 循环法就是通过遍历Map里的Entry,一个个比较,把符合条件的找出来.会有三种情况: (1)找到一个值 (2)找到多个值 (3)找不到 具体代码如下: @Test public void lo

[Swift]LeetCode677. 键值映射 | 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 pai

Go语言 遍历map中的键值对

map 的遍历过程使用 for range 循环完成,代码如下: package main import "fmt" func main() { mapNum := make(map[string]int) mapNum["key1"] = 1 mapNum["key2"] = 2 mapNum["key3"] = 3 mapNum["key4"] = 4 //输出map集合key和value for k,

如何在STL的map中使用结构体作为键值

这里首先给出容器map的原型: template < class Key, class T, class Compare = less<Key>, class Alloc = alloc> class map{ ... } 可以看到模板参数一共有四个,第一个就是Key,即键:第二个就是值:第四个就是空间配置器,默认使用alloc(随STL版本不同而不同).那么第三个是啥? 我们知道,map的底层数据结构,其实是树,更确切的说,是一个RB-tree(红黑树).RB-tree树在进行插

Android4.0 添加一个新的Android 键值

这里添加新的键值,不是毫无凭据凭空创造的一个键值,而是根据kernel中检测到的按键值,然后转化为Android所需要的数值: 以添加一个linux键值为217,把它映射为android的键值Browser(这个键值之前不存在)为例介绍一下: 1.android之前没有这个键值,需要定义 /frameworks/base/core/java/android/view/KeyEvent.java //定义这个新的键值 public static final int KEYCODE_BROWSER