Problem description:

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

Implement the MyHashMap class:

  • MyHashMap() initializes the object with an empty map.
  • void put(int key, int value) inserts a (key, value) pair into the HashMap. If the key already exists in the map, update the corresponding value.
  • int get(int key) returns the value to which the specified key is mapped, or 1 if this map contains no mapping for the key.
  • void remove(key) removes the key and its corresponding value if the map contains the mapping for the key.

Solution:

Array with list of Node to handle collision

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
class ListNode:
def __init__(self, key, val):
self.pair = (key, val)
self.next = None


class MyHashMap:

def __init__(self):
self.size = 1000
self.hash = [None]* self.size


def put(self, key: int, value: int) -> None:
index = key % self.size
if self.hash[index] == None:
# not in map yet
self.hash[index] = ListNode(key, value)
else:
cur = self.hash[index]
while True:
if cur.pair[0] == key:
cur.pair = (key, value)
return
if cur.next == None:
break
cur = cur.next
cur.next = ListNode(key, value)

def get(self, key: int) -> int:
index = key % self.size

if self.hash[index] == None:
return -1
else:
cur = self.hash[index]
while True:
if cur.pair[0] == key:
return cur.pair[1]
if cur.next == None:
return -1
cur = cur.next

def remove(self, key: int) -> None:
index = key % self.size
cur = pre = self.hash[index]
if not cur: return
if cur.pair[0] == key:
self.hash[index] = self.hash[index].next
else:
cur = cur.next
while cur:
if cur.pair[0] == key:
pre.next = cur.next
break
else:
cur, pre = cur.next, pre.next
# Your MyHashMap object will be instantiated and called as such:
# obj = MyHashMap()
# obj.put(key,value)
# param_2 = obj.get(key)
# obj.remove(key)

time complexity: $O()$
space complexity: $O()$
reference:
related problem: