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.
class MyHashMap { private DoublyLinkedList[] buckets; private int capacity; /** Initialize your data structure here. */ public MyHashMap() { this.capacity = 10000; this.buckets = new DoublyLinkedList[capacity]; for (int i = 0; i < capacity; i++) { buckets[i] = new DoublyLinkedList(); } } /** value will always be non-negative. */ public void put(int key, int value) { int bucketIdx = hashCode(key); buckets[bucketIdx].insertToHead(key, value); } /** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */ public int get(int key) { int bucketIdx = hashCode(key); return buckets[bucketIdx].get(key); } /** Removes the mapping of the specified value key if this map contains a mapping for the key */ public void remove(int key) { int bucketIdx = hashCode(key); buckets[bucketIdx].remove(key); } private int hashCode(int key) { return Integer.hashCode(key) % capacity; } } class ListNode { ListNode next, prev; int key; int val; public ListNode(int key, int val) { next = prev = null; this.key = key; this.val = val; } } class DoublyLinkedList { ListNode dummyHead; ListNode dummyTail; public DoublyLinkedList() { dummyHead = new ListNode(-1, -1); dummyTail = new ListNode(-1, -1); dummyHead.next = dummyTail; dummyTail.prev = dummyHead; } public void insertToHead(int key, int val) { ListNode existNode = search(key); if (existNode != null) { existNode.val = val; } else { ListNode newNode = new ListNode(key, val); ListNode nextNode = dummyHead.next; dummyHead.next = newNode; newNode.next = nextNode; nextNode.prev = newNode; newNode.prev = dummyHead; } } private ListNode search(int key) { ListNode p = dummyHead.next; while (p != dummyTail) { if (p.key == key) { return p; } p = p.next; } return null; } public int get(int key) { ListNode node = search(key); return node == null ? -1 : node.val; } public void remove(int key) { ListNode currNode = search(key); if (currNode != null) { ListNode prevNode = currNode.prev; ListNode nextNode = currNode.next; prevNode.next = nextNode; nextNode.prev = prevNode; } } } /** * 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); */
No comments:
Post a Comment