Design a HashMap without using any built-in hash table libraries.
To be specific, your design should include these 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.
Example:
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 keys and values will be in the range of
[0, 1000000]
. - The number of operations will be in the range of
[1, 10000]
. - Please do not use the built-in HashMap library.
设计哈希映射。
题意很简单,不过这道题实现起来,代码量稍微有点多的。我这里给出两种方案。
首先是直接用数组。因为条件里面说了key和value的范围是正数,所以不存在负数的情况,所以可以用数组来处理。再加上数据的范围不是那么大,所以这道题用数组是可以解决的。
1 class MyHashMap { 2 int[] table; 3 4 /** Initialize your data structure here. */ 5 public MyHashMap() { 6 table = new int[1000001]; 7 Arrays.fill(table, -1); 8 } 9 10 /** value will always be non-negative. */ 11 public void put(int key, int value) { 12 table[key] = value; 13 } 14 15 /** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */ 16 public int get(int key) { 17 return table[key]; 18 } 19 20 /** Removes the mapping of the specified value key if this map contains a mapping for the key */ 21 public void remove(int key) { 22 table[key] = -1; 23 } 24 } 25 26 /** 27 * Your MyHashMap object will be instantiated and called as such: 28 * MyHashMap obj = new MyHashMap(); 29 * obj.put(key,value); 30 * int param_2 = obj.get(key); 31 * obj.remove(key); 32 */
再来我提供一个list的做法。需要创建两个list of list,一个用来记录key,一个用来记录value,这样key和value的键值对才能对应起来。这两个list of list的长度我给了500,不是很大,但是解决这个题是够了。当看到一个key的时候,为了避免哈希碰撞,我把这个key % 500。因为我创建的是list of list,所以即使再有冲突也不怕,加到那个对应的sublist里面即可。value加入的位置始终跟key被加入的位置一样。
1 class MyHashMap { 2 List<List<Integer>> keys; 3 List<List<Integer>> values; 4 int len = 500; 5 6 /** Initialize your data structure here. */ 7 public MyHashMap() { 8 keys = new ArrayList<>(); 9 values = new ArrayList<>(); 10 for (int i = 0; i < len; i++) { 11 keys.add(i, new ArrayList<>()); 12 values.add(i, new ArrayList<>()); 13 } 14 } 15 16 private boolean contains(int key) { 17 return keys.get(key % len).contains(key); 18 } 19 20 /** value will always be non-negative. */ 21 public void put(int key, int value) { 22 if (contains(key)) { 23 remove(key); 24 } 25 keys.get(key % len).add(key); 26 values.get(key % len).add(value); 27 } 28 29 /** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */ 30 public int get(int key) { 31 if (contains(key)) { 32 int index = keys.get(key % len).indexOf((Integer) key); 33 return values.get(key % len).get(index); 34 } 35 return -1; 36 } 37 38 /** Removes the mapping of the specified value key if this map contains a mapping for the key */ 39 public void remove(int key) { 40 if (contains(key)) { 41 int index = keys.get(key % len).indexOf((Integer) key); 42 keys.get(key % len).remove(index); 43 values.get(key % len).remove(index); 44 } 45 } 46 } 47 48 /** 49 * Your MyHashMap object will be instantiated and called as such: 50 * MyHashMap obj = new MyHashMap(); 51 * obj.put(key,value); 52 * int param_2 = obj.get(key); 53 * obj.remove(key); 54 */