目录结构
1.题目
不使用任何内建的哈希表库设计一个哈希映射
具体地说,你的设计应该包含以下的功能
- put(key, value):向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更新这个值。
- get(key):返回给定的键所对应的值,如果映射中不包含这个键,返回-1。
- remove(key):如果映射中存在这个键,删除这个数值对。
示例:
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 (未找到)
注意:
- 所有的值都在
[0, 1000000]
的范围内。 - 操作的总数目在
[1, 10000]
范围内。 - 不要使用内建的哈希库。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-hashmap
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.题解
双List。
public class Solution706 {
@Test
public void test706() {
MyHashMap myHashMap = new MyHashMap();
myHashMap.put(1, 1);
myHashMap.put(2, 2);
assertEquals(1, myHashMap.get(1));
assertEquals(-1, myHashMap.get(3));
myHashMap.put(2, 1);
assertEquals(1, myHashMap.get(2));
myHashMap.remove(2);
assertEquals(-1, myHashMap.get(2));
}
class MyHashMap {
List<Integer> map_key, map_value;
public MyHashMap() {
map_key = new ArrayList<>();
map_value = new ArrayList<>();
}
public void put(int key, int value) {
if (map_key.contains(key)) {
map_value.set(map_key.indexOf(key), value);
} else {
map_key.add(key);
map_value.add(value);
}
}
public int get(int key) {
if (map_key.contains(key)) {
return map_value.get(map_key.indexOf(key));
} else {
return -1;
}
}
public void remove(int key) {
if (map_key.contains(key)) {
map_value.remove(map_key.indexOf(key));
map_key.remove((Integer) key);
}
}
}
}