题目链接
https://leetcode-cn.com/problems/design-hashmap/
描述
不使用任何内建的哈希表库设计一个哈希映射
具体地说,你的设计应该包含以下的功能
put(key, value):向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更新这个值。
get(key):返回给定的键所对应的值,如果映射中不包含这个键,返回-1。
remove(key):如果映射中存在这个键,删除这个数值对。
注意:
所有的值都在 [0, 1000000]的范围内。
操作的总数目在[1, 10000]范围内。
不要使用内建的哈希库。
示例
MyHashMap hashMap = new MyHashMap();
hashMap.put(1, 1);
hashMap.put(2, 2);
hashMap.get(1); // 返回 1
hashMap.get(3); // 返回 -1 (未找到)
hashMap.put(2, 1); // 更新已有的值
hashMap.get(2); // 返回 1
hashMap.remove(2); // 删除键为2的数据
hashMap.get(2); // 返回 -1 (未找到)
初始代码模板
代码
和705题非常类似,主要是哈希函数和冲突处理。可以看看官方题解,我没有使用泛型:
https://leetcode-cn.com/problems/design-hashmap/solution/she-ji-ha-xi-biao-by-leetcode/
class MyHashMap {
private Node[] bucketArr;
private int size;
/** Initialize your data structure here. */
public MyHashMap() {
this.size = 769;
this.bucketArr = new Node[this.size];
}
private int calHash(int key) {
return key % this.size;
}
/** value will always be non-negative. */
public void put(int key, int value) {
int bucketIndex = calHash(key);
Node head = bucketArr[bucketIndex];
if (head == null) {
bucketArr[bucketIndex] = new Node(key, value);
return;
}
Node prev = null;
while (head != null) {
if (head.key == key) {
head.val = value;
return;
}
prev = head;
head = head.next;
}
prev.next = new Node(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 bucketIndex = calHash(key);
Node head = bucketArr[bucketIndex];
while (head != null) {
if (head.key == key) {
return head.val;
}
head = head.next;
}
return -1;
}
/** Removes the mapping of the specified value key if this map contains a mapping for the key */
public void remove(int key) {
int bucketIndex = calHash(key);
Node head = bucketArr[bucketIndex];
if (head != null && head.key == key) {
bucketArr[bucketIndex] = head.next;
return;
}
Node prev = null;
while (head != null) {
if (head.key == key) {
prev.next = head.next;
return;
}
prev = head;
head = head.next;
}
}
}
class Node {
int key;
int val;
Node next;
Node(int key, int val) {
this.key = key;
this.val = val;
}
}
/**
* 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);
*/