C#LeetCode刷题之#706-设计哈希映射(Design HashMap)

问题

不使用任何内建的哈希表库设计一个哈希映射

具体地说,你的设计应该包含以下的功能

put(key, value):向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更新这个值。
get(key):返回给定的键所对应的值,如果映射中不包含这个键,返回-1。
remove(key):如果映射中存在这个键,删除这个数值对。

MyHashMap hashMap = new MyHashMap();

hashMap.put(1, 1);          

hashMap.put(2, 2);         

hashMap.get(1);            // 返回 1

hashMap.get(3);            // 返回 -1 (未找到)

hashMap.put(2, 1);         // 更新已有的值

hashMap.get(2);            // 返回 1 

hashMap.remove(2);         // 删除键为2的数据

hashMap.get(2);            // 返回 -1 (未找到) 

注意:

所有的值都在 [1, 1000000]的范围内。
操作的总数目在[1, 10000]范围内。
不要使用内建的哈希库。

Design a HashMap without using any built-in hash table libraries.

To be specific, your design should include these two functions:

put(key, value) : Insert a (key, value) pair into the HashMap. If the value already exists in the HashMap, update the value.
get(key): Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key.
remove(key) : Remove the mapping for the value key if this map contains the mapping for the key.

MyHashMap hashMap = new MyHashMap();

hashMap.put(1, 1);          

hashMap.put(2, 2);         

hashMap.get(1);            // returns 1

hashMap.get(3);            // returns -1 (not found)

hashMap.put(2, 1);          // update the existing value

hashMap.get(2);            // returns 1 

hashMap.remove(2);          // remove the mapping for 2

hashMap.get(2);            // returns -1 (not found) 

Note:

All values will be in the range of [1, 1000000].
The number of operations will be in the range of [1, 10000].
Please do not use the built-in HashMap library.

示例

public class Program {

    public static void Main(string[] args) {
        var hashMap = new MyHashMap();

        hashMap.Put(1, 1);
        hashMap.Put(2, 2);
        hashMap.Get(1);
        hashMap.Get(3);
        hashMap.Put(2, 1);
        hashMap.Get(2);
        hashMap.Remove(2);
        hashMap.Get(2);

        Console.ReadKey();
    }

    public class MyHashMap {

        private int[] buckets;

        public MyHashMap() {
            buckets = new int[1000000];
            for(var i = 0; i < buckets.Length; i++) {
                buckets[i] = -1;
            }
        }

        private int GetHashCode(int key) {
            //用本身值作为散列值
            return key;
        }

        public void Put(int key, int value) {
            buckets[GetHashCode(key)] = value;
        }

        public int Get(int key) {
            var res = buckets[GetHashCode(key)];
            Console.WriteLine(res);
            return res;
        }

        public void Remove(int key) {
            buckets[GetHashCode(key)] = -1;
        }

    }

}

以上给出1种算法实现,以下是这个案例的输出结果:

1
-1
1
-1

分析:

注意该题的测试用例中包含值为0的项目,并不是题目中[1, 1000000]的范围内。所以很无奈的在构造函数中初始化所有值为-1。

显而易见,MyHashMap解法中的Put、Get和Remove三个方法均为 O(1) 的常量时间复杂度。 

本文由 .Net中文网 原创发布,欢迎大家踊跃转载。

转载请注明本文地址:https://www.byteflying.com/archives/4116

发表评论

登录后才能评论