LeetCode刷题——哈希表(python语言)

一、哈希表

1.1 哈希表的概念

哈希表,也叫散列表。其实可以很像python的字典,也就是键(key)值(Hash(key))对,最简单也最常用的哈希表就是索引与索引的值具有一定的对应关系,(哈希函数)也就是说,a[0]=3代表数组中元素0的个数为3,可以看到哈希表大部分都被用来统计数据。而a[i]=[i],对于跨度大的数据又会特别浪费内存,所以会有一系列的填充算法。也就是哈希函数的构造,通常有直接定地址法、除留余数法、平方取中法、基数转化法、数字分析法、折叠法、随机数法、乘积法、点积法等。

1.2 哈希冲突

即使出现了如此多的填充算法改进这一问题,但是仍然可能会存在冲突,比如一个key要填充到哈希表,但是该地方已经被占用,这种情况被称为哈希冲突。为了这种情况下有两种方案来解决这一问题。分别是开放地址法和链地址法。
开发地址法:指的是哈希表的空地址向处理冲突开放。比如key已经被用。可以尝试key+1.找其他的位置有很多方法,比如线性探测法,分别从1,2,3,…找。或者二次探测法,从1,-1,4,-4,…等,伪随机数序列,随机的位置。而链地址法,则是将哈希表的数组每一个元素当作表头,冲突的元素通过头插法或者尾插法都放在同一个元素的表头下。

二、刷题

2.1 存在重复元素

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

示例 1:
输入:nums = [1,2,3,1]
输出:true

示例 2:
输入:nums = [1,2,3,4]
输出:false

示例 3:
输入:nums = [1,1,1,3,3,4,3,2,4,2]
输出:true

提示:
1 <= nums.length <= 105
-109 <= nums[i] <= 109

class Solution:def containsDuplicate(self, nums: List[int]) -> bool:map = dict()for i in nums:if i not in map:map[i] = 1 else:return True return False

2.2 存在重复元素 II

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。

示例 1:
输入:nums = [1,2,3,1], k = 3
输出:true

示例 2:
输入:nums = [1,0,1,1], k = 1
输出:true

示例 3:
输入:nums = [1,2,3,1,2,3], k = 2
输出:false

提示:
1 <= nums.length <= 105
-109 <= nums[i] <= 109
0 <= k <= 105

class Solution:def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:map = dict()for i,num in enumerate(nums):if num not in map:map[num] = ielse:if(abs(i-map[num])<=k):return True else:map[num] = ireturn False

2.3 宝石与石头

给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。

字母区分大小写,因此 “a” 和 “A” 是不同类型的石头。

示例 1:
输入:jewels = “aA”, stones = “aAAbbbb”
输出:3

示例 2:
输入:jewels = “z”, stones = “ZZ”
输出:0

提示:
1 <= jewels.length, stones.length <= 50
jewels 和 stones 仅由英文字母组成
jewels 中的所有字符都是 唯一的

class Solution:def numJewelsInStones(self, jewels: str, stones: str) -> int:map = {s:1 for s in jewels}sum = 0for s in stones:if(s in map):sum += 1 else:continuereturn sum
class Solution:def numJewelsInStones(self, jewels: str, stones: str) -> int:sum = 0for s in stones:if(s in jewels):sum += 1 else:continuereturn sum

2.4 有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

注意:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
空白格用 ‘.’ 表示。

示例 1:
输入:board =
[[“5”,“3”,".",".",“7”,".",".",".","."]
,[“6”,".",".",“1”,“9”,“5”,".",".","."]
,[".",“9”,“8”,".",".",".",".",“6”,"."]
,[“8”,".",".",".",“6”,".",".",".",“3”]
,[“4”,".",".",“8”,".",“3”,".",".",“1”]
,[“7”,".",".",".",“2”,".",".",".",“6”]
,[".",“6”,".",".",".",".",“2”,“8”,"."]
,[".",".",".",“4”,“1”,“9”,".",".",“5”]
,[".",".",".",".",“8”,".",".",“7”,“9”]]
输出:true

示例 2:
输入:board =
[[“8”,“3”,".",".",“7”,".",".",".","."]
,[“6”,".",".",“1”,“9”,“5”,".",".","."]
,[".",“9”,“8”,".",".",".",".",“6”,"."]
,[“8”,".",".",".",“6”,".",".",".",“3”]
,[“4”,".",".",“8”,".",“3”,".",".",“1”]
,[“7”,".",".",".",“2”,".",".",".",“6”]
,[".",“6”,".",".",".",".",“2”,“8”,"."]
,[".",".",".",“4”,“1”,“9”,".",".",“5”]
,[".",".",".",".",“8”,".",".",“7”,“9”]]
输出:false
解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。

提示:
board.length == 9
board[i].length == 9
board[i][j] 是一位数字(1-9)或者 ‘.’

class Solution:def isValidSudoku(self, board: List[List[str]]) -> bool:rows_map = [dict() for _ in range(9)]cols_map = [dict() for _ in range(9)]boxes_map = [dict() for _ in range(9)]for i in range(9):for j in range(9):if(board[i][j]=='.'):continueelse:num = int(board[i][j])boxes = (i // 3) * 3  + j // 3rows_num = rows_map[i].get(num,0)cols_num = cols_map[j].get(num,0)boxes_num = boxes_map[boxes].get(num,0)if(rows_num >0 or cols_num>0 or boxes_num >0):return False rows_map[i][num] = 1 cols_map[j][num] = 1 boxes_map[boxes][num] = 1 return True

2.5 子域名访问计数

网站域名 “discuss.leetcode.com” 由多个子域名组成。顶级域名为 “com” ,二级域名为 “leetcode.com” ,最低一级为 “discuss.leetcode.com” 。当访问域名 “discuss.leetcode.com” 时,同时也会隐式访问其父域名 “leetcode.com” 以及 “com” 。

计数配对域名 是遵循 “rep d1.d2.d3” 或 “rep d1.d2” 格式的一个域名表示,其中 rep 表示访问域名的次数,d1.d2.d3 为域名本身。

例如,“9001 discuss.leetcode.com” 就是一个 计数配对域名 ,表示 discuss.leetcode.com 被访问了 9001 次。
给你一个 计数配对域名 组成的数组 cpdomains ,解析得到输入中每个子域名对应的 计数配对域名 ,并以数组形式返回。可以按 任意顺序 返回答案。

示例 1:

输入:cpdomains = [“9001 discuss.leetcode.com”]
输出:[“9001 leetcode.com”,“9001 discuss.leetcode.com”,“9001 com”]
解释:例子中仅包含一个网站域名:“discuss.leetcode.com”。
按照前文描述,子域名 “leetcode.com” 和 “com” 都会被访问,所以它们都被访问了 9001 次。

示例 2:

输入:cpdomains = [“900 google.mail.com”, “50 yahoo.com”, “1 intel.mail.com”, “5 wiki.org”]
输出:[“901 mail.com”,“50 yahoo.com”,“900 google.mail.com”,“5 wiki.org”,“5 org”,“1 intel.mail.com”,“951 com”]
解释:按照前文描述,会访问 “google.mail.com” 900 次,“yahoo.com” 50 次,“intel.mail.com” 1 次,“wiki.org” 5 次。
而对于父域名,会访问 “mail.com” 900 + 1 = 901 次,“com” 900 + 50 + 1 = 951 次,和 “org” 5 次。

提示:
1 <= cpdomain.length <= 100
1 <= cpdomain[i].length <= 100
cpdomain[i] 会遵循 “repi d1i.d2i.d3i” 或 “repi d1i.d2i” 格式
repi 是范围 [1, 104] 内的一个整数
d1i、d2i 和 d3i 由小写英文字母组成

class Solution:def subdomainVisits(self, cpdomains):""":type cpdomains: List[str]:rtype: List[str]"""dic = {}for s in cpdomains:count = int(s.split()[0]) #注意分割后是字符串,要转整形,不然加法会出错host = s.split()[-1].split('.')for i in range(len(host)):temp = '.'.join(host[i:]) #拼接所有域名的可能组合if temp in dic.keys():dic[temp] += count #把域名做key,访问次数做valueelse:dic[temp] = countres = []for key in dic.keys():res.append(str(dic[key]) + ' ' + key)  #要转为字符串类型做+运算return res

LeetCode刷题——哈希表(python语言)相关推荐

  1. C#LeetCode刷题-哈希表

    哈希表篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 42.8% 简单 3 无重复字符的最长子串   24.2% 中等 18 四数之和   ...

  2. LeetCode 刷题之路(python版)

    摘自:https://blog.csdn.net/qq_32384313/article/details/90745354 LeetCode 刷题之路(python版) 小坏wz 2019-06-02 ...

  3. 算法刷题-哈希表-四数相加

    需要哈希的地方都能找到map的身影 第454题.四数相加II 力扣题目链接 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + ...

  4. C#LeetCode刷题之#168-Excel表列名称(Excel Sheet Column Title)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3850 访问. 给定一个正整数,返回它在 Excel 表中相对应的 ...

  5. C#LeetCode刷题之#171-Excel表列序号(Excel Sheet Column Number)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3852 访问. 给定一个Excel表格中的列名称,返回其相应的列序 ...

  6. C#LeetCode刷题之#876-链表的中间结点(Middle of the Linked List)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3836 访问. 给定一个带有头结点 head 的非空单链表,返回链 ...

  7. C#LeetCode刷题-数学

    数学篇 # 题名 刷题 通过率 难度 2 两数相加 29.0% 中等 7 反转整数 C#LeetCode刷题之#7-反转整数(Reverse Integer) 28.6% 简单 8 字符串转整数 (a ...

  8. C#LeetCode刷题-链表

    链表篇 # 题名 刷题 通过率 难度 2 两数相加   29.0% 中等 19 删除链表的倒数第N个节点   29.4% 中等 21 合并两个有序链表 C#LeetCode刷题之#21-合并两个有序链 ...

  9. leetcode刷题优质题解(C++,Python,Go语言)

    最近开始为秋招准备,深感自己的编程能力基础弱,遂希望通过刷leetcode来提升数据结构和算法分析能力.过程中发现了几个优质题解,分享给大家,尤其是Carl哥的代码随想录包含C++.Java.Pyth ...

最新文章

  1. 数组公式基本功修炼之数组扩充
  2. AngularJS学习笔记(二) 表单验证案例(ng-repeat/filter)
  3. 第三篇——第二部分——第三文 配置SQL Server镜像——域环境
  4. 博士申请 | 南洋理工大学骆思强老师招收大数据/机器学习方向博士生、博士后...
  5. 画箱线图_箱线图的N种画法
  6. 字符动图_手把手教你做一个python+matplotlib的炫酷的数据可视化动图
  7. 如何使用DNS反向映射来扫描IPv6地址?
  8. springboot的thymeleaf一个页面中引入其它页面
  9. 前端遇到瓶颈了怎么办?
  10. Oracle事务隔离级别
  11. ORACLE 10g创建单实例 ASM
  12. 【边尝试边写博客】入侵学校服务器
  13. 简易记事本android代码,Android实现简易记事本
  14. LeetCode每日一题: 1723. 完成所有工作的最短时间
  15. [组合数学] NC13611树 (逆元的计算)
  16. Spring Boot从0开始学的个人笔记10 --任务
  17. 我们分析了 10000 条视频,终于知道了今日头条推荐系统的秘密
  18. Kubernetes---Secret配置管理
  19. python opencv 直方图均衡_OpenCV-Python教程(10、直方图均衡化)
  20. 法硕有专硕学硕之分吗?

热门文章

  1. 高斯数学——看动画学奥数
  2. python实现音乐播放和下载小程序功能
  3. 报错为method does not override method from its superclass解决
  4. 使用WRLD 3D建立动态3D地图
  5. 固态硬盘连接在SATA2、SATA3接口上,使用不同SATA线的速度对比
  6. 毕业设计 Spring Boot的驾校预约管理系统(含源码+论文)
  7. Android拍照和获取相册图片
  8. 1.谷粒商城1-5文字版
  9. DAX 微信 markdown 编辑器
  10. android后台发送短信的实现