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 { int[] map; /** Initialize your data structure here. */ public MyHashMap() { map = new int[1000001]; } /** value will always be non-negative. */ public void put(int key, int value) { map[key] = value + 1; } /** 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) { return map[key] - 1; } /** Removes the mapping of the specified value key if this map contains a mapping for the key */ public void remove(int key) { map[key] = 0; } }
用large size array,很快啊,也很偷懒。
hashmap原理就是用array和linkedlist。
put就是先表示成ListNode,然后通过hash来找数组中key对应的下标,找到后看这个数组有没有linkedlist,如果有就查有没有同样的key有就替换,没有就添加到最后一个。
get是用hash key找数组的下标,如果这个数组下标对应的没有就返回null,有就遍历linkedlist,找到key对应的value。
https://baijiahao.baidu.com/s?id=1665667572592680093&wfr=spider&for=pc
class MyHashMap { final ListNode[] nodes = new ListNode[10000]; public void put(int key, int value) { int i = idx(key); if (nodes[i] == null) nodes[i] = new ListNode(-1, -1); ListNode prev = find(nodes[i], key); if (prev.next == null) prev.next = new ListNode(key, value); else prev.next.val = value; } public int get(int key) { int i = idx(key); if (nodes[i] == null) return -1; ListNode node = find(nodes[i], key); return node.next == null ? -1 : node.next.val; } public void remove(int key) { int i = idx(key); if (nodes[i] == null) return; ListNode prev = find(nodes[i], key); if (prev.next == null) return; prev.next = prev.next.next; } int idx(int key) { return Integer.hashCode(key) % nodes.length;} ListNode find(ListNode bucket, int key) { ListNode node = bucket, prev = null; while (node != null && node.key != key) { prev = node; node = node.next; } return prev; } class ListNode { int key, val; ListNode next; ListNode(int key, int val) { this.key = key; this.val = val; } } }