作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址:https://leetcode.com/problems/design-hashmap/description/

题目描述

Design a HashMap without using any built-in hash table libraries.

To be specific, your design should include these two 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 values will be in the range of [1, 1000000].
  • The number of operations will be in the range of [1, 10000].
  • Please do not use the built-in HashMap library.

题目大意

动手实现一个hashmap.不能用已经内置的函数。

解题方法

这个题和705. Design HashSet基本一样啊。705是要设计hashset,当时只要把某个位置设置成1,就表示这个元素存在了即可。这个题只需要把当时的设置成1改成设置成对应的value。

写这个题的时候就要考虑,不能把每个位置初始化成0,因为这样会和value值冲突。即加入value就是0,那么这个位置的0不知道怎么判断。所以应该初始化None,后面对这个位置是否存在元素的判断也是必须判断==None而不是not的方式进行判断。

代码如下:

class MyHashMap:

    def __init__(self):
"""
Initialize your data structure here.
"""
self.buckets = 1000
self.itemsPerBuckect = 1001
self.hashmap = [[] for _ in range(self.buckets)] def hash(self, key):
return key % self.buckets def pos(self, key):
return key // self.buckets def put(self, key, value):
"""
value will always be positive.
:type key: int
:type value: int
:rtype: void
"""
hashkey = self.hash(key)
if not self.hashmap[hashkey]:
self.hashmap[hashkey] = [None] * self.itemsPerBuckect
self.hashmap[hashkey][self.pos(key)] = value def get(self, key):
"""
Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key
:type key: int
:rtype: int
"""
hashkey = self.hash(key)
if (not self.hashmap[hashkey]) or self.hashmap[hashkey][self.pos(key)] == None:
return -1
else:
return self.hashmap[hashkey][self.pos(key)] def remove(self, key):
"""
Removes the mapping of the specified value key if this map contains a mapping for the key
:type key: int
:rtype: void
"""
hashkey = self.hash(key)
if self.hashmap[hashkey]:
self.hashmap[hashkey][self.pos(key)] = None # Your MyHashMap object will be instantiated and called as such:
# obj = MyHashMap()
# obj.put(key,value)
# param_2 = obj.get(key)
# obj.remove(key)

上面的做法比较省内存,如果不用省内存的话,可以直接开出来这么大的数组即可。事实上,1000000大小的数组,内存不会超的。

另外一个技巧就是,把数组初始化为-1,这样既不会和原始的数据冲突,而且当查询的时候,可以直接返回这个数值,正好是题目的要求。

class MyHashMap(object):

    def __init__(self):
"""
Initialize your data structure here.
"""
self.bitmap = [[-1] * 1000 for _ in range(1001)] def put(self, key, value):
"""
value will always be non-negative.
:type key: int
:type value: int
:rtype: void
"""
row, col = key / 1000, key % 1000
self.bitmap[row][col] = value def get(self, key):
"""
Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key
:type key: int
:rtype: int
"""
row, col = key / 1000, key % 1000
return self.bitmap[row][col] def remove(self, key):
"""
Removes the mapping of the specified value key if this map contains a mapping for the key
:type key: int
:rtype: void
"""
row, col = key / 1000, key % 1000
self.bitmap[row][col] = -1 # Your MyHashMap object will be instantiated and called as such:
# obj = MyHashMap()
# obj.put(key,value)
# param_2 = obj.get(key)
# obj.remove(key)

如果直接使用一维数组的话,那么也可以通过,其实更简单了。

class MyHashMap(object):

    def __init__(self):
"""
Initialize your data structure here.
"""
self.bitmap = [-1] * 1000001 def put(self, key, value):
"""
value will always be non-negative.
:type key: int
:type value: int
:rtype: void
"""
self.bitmap[key] = value def get(self, key):
"""
Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key
:type key: int
:rtype: int
"""
return self.bitmap[key] def remove(self, key):
"""
Removes the mapping of the specified value key if this map contains a mapping for the key
:type key: int
:rtype: void
"""
self.bitmap[key] = -1 # Your MyHashMap object will be instantiated and called as such:
# obj = MyHashMap()
# obj.put(key,value)
# param_2 = obj.get(key)
# obj.remove(key)

日期

2018 年 7 月 12 日 —— 天阴阴地潮潮,已经连着两天这样了
2018 年 11 月 13 日 —— 时间有点快

最新文章

  1. MySQL数据类型 int(M) 表示什么意思?详解mysql int类型的长度值问题
  2. Access 2003 中自定义菜单栏
  3. sqlserver2008 ,只能选C盘目录,不能选其它盘目录
  4. iOS 提交代码出现提示弹出框显示 “A commit message is required to perform this operation.Enter a commit message and try again.“
  5. 【英语】Bingo口语笔记(23) - 万圣节系列
  6. devexpress GridControl 行指示列图标绘制
  7. 【UI控件总结】【UIScrollView】深入理解篇UIScrollerView
  8. 轻量级jQuery工具提示插件tooltipsy使用方法
  9. C++的四种cast操作符的区别--类型转换
  10. 实验排队功能实现(JAVA)
  11. windows server 2008 R2服务器无法通过ShellClass获取mp3音乐时长
  12. Laravel5使用QQ邮箱发送邮件配置
  13. [SharePoint 2010] SharePoint 2010 FBA 配置以及自定义首页
  14. C#中 DateTime , DateTime2 ,DateTimeOffset 之间的小区别 (转载)
  15. JPG图片EXIF信息提取工具exif
  16. 【IDEA】【maven】idea使用maven插件 打包提示找不到符号找不到类,但是却没有错误
  17. Android Dialog 的一些特性
  18. 【ML】有偏样本解决方案
  19. Objective-C中new与alloc/init的区别
  20. [GO]并行和并发的区别

热门文章

  1. C++类成员初始化列表的构造顺序
  2. 【Redis集群原理专题】分析一下相关的Redis集群模式下的脑裂问题!
  3. (数据科学学习手札132)Python+Fabric实现远程服务器连接
  4. Android 获取html中指定标签
  5. A Child's History of England.14
  6. Hadoop的HA机制浅析
  7. Set、Map、WeakSet 和 WeakMap 的区别
  8. 什么是 IP 地址 – 定义和解释
  9. SpringBoot(2):运行原理
  10. Centos 的常用命令总结