Problem
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 <= 10^6At most
10^4calls will be made toput,get, andremove.
Solution (Java)
class MyHashMap {
private ArrayList[] arr = null;
public MyHashMap() {
arr = new ArrayList[1000];
}
public void put(int key, int value) {
int bucket = key % 1000;
if (arr[bucket] == null) {
ArrayList<Entry> list = new ArrayList<>();
Entry e = new Entry();
e.key = key;
e.value = value;
list.add(e);
arr[bucket] = list;
} else {
ArrayList<Entry> list = arr[bucket];
Entry e = new Entry();
e.key = key;
e.value = value;
list.remove(e);
list.add(e);
}
}
public int get(int key) {
int bucket = key % 1000;
int ans = -1;
ArrayList<Entry> list = arr[bucket];
if (list != null) {
for (Entry e : list) {
if (e.key == key) {
ans = e.value;
}
}
}
return ans;
}
public void remove(int key) {
int bucket = key % 1000;
ArrayList<Entry> list = arr[bucket];
Entry e = new Entry();
e.key = key;
if (list != null) {
list.remove(e);
}
}
static class Entry {
int key;
int value;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + key;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Entry other = (Entry) obj;
return key == other.key;
}
}
}
/**
* 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);
*/
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).