Design HashMap - Hashing using modulo
Problem Statement:
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 thekeyalready exists in the map, update the correspondingvalue.int get(int key)returns thevalueto which the specifiedkeyis mapped, or-1if this map contains no mapping for thekey.void remove(key)removes thekeyand its correspondingvalueif the map contains the mapping for thekey.
Example 1:
Input ["MyHashMap", "put", "put", "get", "get", "put", "get", "remove", "get"] [[], [1, 1], [2, 2], [1], [3], [2, 1], [2], [2], [2]] Output [null, null, null, 1, -1, null, 1, null, -1] Explanation MyHashMap myHashMap = new MyHashMap(); myHashMap.put(1, 1); // The map is now [[1,1]] myHashMap.put(2, 2); // The map is now [[1,1], [2,2]] myHashMap.get(1); // return 1, The map is now [[1,1], [2,2]] myHashMap.get(3); // return -1 (i.e., not found), The map is now [[1,1], [2,2]] myHashMap.put(2, 1); // The map is now [[1,1], [2,1]] (i.e., update the existing value) myHashMap.get(2); // return 1, The map is now [[1,1], [2,1]] myHashMap.remove(2); // remove the mapping for 2, The map is now [[1,1]] myHashMap.get(2); // return -1 (i.e., not found), The map is now [[1,1]]
Constraints:
0 <= key, value <= 106- At most
104calls will be made toput,get, andremove.
Solution:
We learn this in college. It is good to get a chance to implement. Here we use modulo operator as the hashing function and M is chosen to be a big enough prime.
class Node {
public:
int key;
int val;
Node *next;
Node(int k, int v, Node *n){key=k;val=v;next=n;}
};
class MyHashMap {
public:
vector<Node *>nodes;
int N;
MyHashMap(int n=99991) {
nodes = vector<Node *>(n,NULL);
N = n;
}
void put(int key, int value) {
int h = key%N;
if (nodes[h]==NULL)
{
nodes[h]=new Node(key,value,NULL);
return;
}
Node *curr=nodes[h];
while (curr!=NULL)
{
if (curr->key==key)
{
curr->val=value;
return;
}
curr=curr->next;
}
while (curr->next!=NULL) curr=curr->next;
curr->next=new Node(key,value,NULL);
}
int get(int key) {
int h = key%N;
if (nodes[h]==NULL) return -1;
Node *curr = nodes[h];
while (curr!=NULL)
{
if (curr->key==key) return curr->val;
curr=curr->next;
}
return -2;
}
void remove(int key) {
int h=key%N;
if (nodes[h]==NULL) return;
if (nodes[h]->key==key)
{
nodes[h]=nodes[h]->next;
return;
}
Node *curr=nodes[h];
while (curr->next!=NULL && curr->next->key!=key) curr=curr->next;
curr->next = curr->next->next;
}
};
/**
* Your MyHashMap object will be instantiated and called as such:
* MyHashMap* obj = new MyHashMap();
* obj->put(key,value);
* int param_2 = obj->get(key);
* obj->remove(key);
*/
I solved the HashSet problem too using similar method: https://leetcode.com/problems/design-hashset/discuss/1968599/Hashing-using-modulo