Hash Exercise 21.11.27
Day01 and Day02 理论学习
什么是哈希桶?就是键对应的那个链表,生活中把东西放入桶中是有顺序的,因此用桶来比喻有顺序的链表
目录
- 问题1 经典的两数之和
- 1、双指针
- 2、哈希表
- 问题2 单词模式匹配
- LeetCode原题
- 问题3 猜词游戏
- 问题4 神奇的词根
- 暴力解法
- Hash解法
问题1 经典的两数之和
1、双指针
需要排序
2、哈希表
双指针解法的缺点,排序之后还要找到原始数据这两个数字的位置
哈希表解法:一边记录数字,一边寻找它的另一半
class Solution(object):def twoSum(self, nums, target):dic = {}for i in range(len(nums)):m = nums[i]if target - m in dic:return (i + 1, dic[target - m] + 1)dic[nums[i]] = iA = Solution()
print(A.twoSum([2,3,4,6], 7))
问题2 单词模式匹配
规则:如果单词模式字符串和目标字符串只存在一对一的对应关系,不存在一对多和多对多的对应关系,就可以说明两个字符串匹配成功
要点,除一对多,多对一的情况
模式字符串中的每个字符只能对应目标字符串一个单词的问题。
当模式字符串中的某个字符第一次出现时,还需要判断这个单词是否已经和其他的模式字符绑定。
class Solution(object):def wordPattern(self, wordPattern, word):# 如果长度不一致直接Falseif len(wordPattern) != len(word):return False# 单词的哈希表,防止一个单词对应多个模式wordHash = {}# 模式的哈希表,防止一个模式对应多个单词patternHash = {}# 对单词或模式遍历都是一样的,因为它们长度已经相等for i in range(len(word)):# 如果单词出现过,比较模式if word[i] in wordHash:if wordPattern[i] != wordHash[word[i]]:return Falseelse:# 如果单词没有出现过,但是却已经用过它对应的模式if wordPattern[i] in patternHash:return FalsewordHash[word[i]] = wordPattern[i]patternHash[wordPattern[i]] = True # 或者 word[i]return TrueA = Solution()
print(A.wordPattern([1, 3, 2, 2], ["apple", "pear", "banana", "banana"]))
print(A.wordPattern([1, 1, 2, 2], ["apple", "apple", "banana", "banana"]))
print(A.wordPattern([1, 1, 1, 1], ["apple", "apple", "banana", "banana"]))
print(A.wordPattern([1, 1, 2], ["apple", "apple", "banana", "banana"]))
True
True
False
False
LeetCode原题
205.同构字符串
class Solution(object):def isIsomorphic(self, s, t):""":type s: str:type t: str:rtype: bool"""if len(s) != len(t):return FalsesHash = {}tHash = {}for i in range(len(s)):# 如果s[i]在sHash中出现了if s[i] in sHash:if t[i] != sHash[s[i]]:return Falseelse:# 如果s[i]没有出现,它的模式却用过了if t[i] in tHash:return FalsesHash[s[i]] = t[i]tHash[t[i]] = Truereturn True
问题3 猜词游戏
299.猜数字游戏
游戏规则:一个人写下几个数字让另外一个人猜,当每次答题方猜完之后,出题方会给答题方一个提示,告诉他刚才的猜测中有多少位数字和确切位置都猜对了(Bulls),还有多少位数字猜对了但是位置不对(Cows),答题方根据出题方的提示继续猜,知道猜出秘密数字为止。
例子:secret2018,guess8021
0数字和位置都对了,A表示公牛
128数字都对了,位置全不对,B表示奶牛
所以给出提示:1A3B
练习:secret1123,guess9111 (1A1B)
问题求解
本题只需判断一次,没有那么复杂
对secret或guess一次遍历,反正长度一样
- 先判断同位置上是否相等,如果相等,则公牛加一,并跳过Hash记录
- 如果不相等,就记录在两个Hash表中
再对字典遍历,如果两个都有出现,取最小值,并将记录加到奶牛中
class Solution(object):def getHint(self, secret, guess):bulls = 0 # 公牛的个数cows = 0 # 奶牛的个数secretDict = {}guessDict = {}# 查找公牛直接一一对应for i in range(len(secret)):if secret[i] == guess[i]:bulls = bulls + 1else:if secret[i] in secretDict:secretDict[secret[i]] += 1else:secretDict[secret[i]] = 1if guess[i] in guessDict:guessDict[guess[i]] += 1else:guessDict[guess[i]] = 1for item in secretDict:if item in guessDict:cows = cows + min(secretDict[item], guessDict[item])return str(bulls) + 'A' + str(cows) + "B"A = Solution()
print(A.getHint("2018", "8021"))
print(A.getHint("1123", "9111"))
print(A.getHint("1", "0"))
print(A.getHint("0", "0"))
1A3B
1A1B
0A0B
1A0B
问题4 神奇的词根
648.单词替换
- 1 <= dictionary.length <= 1000
- 1 <= dictionary[i].length <= 100
- dictionary[i] 仅由小写字母组成。
- sentence 中单词的总量在范围 [1, 1000] 内。
- sentence 中每个单词的长度在范围 [1, 1000] 内。
例子:词根 [“cat”, “bat”, “rat”]
句子"the cattle was rattled by the battery"
替换"the cat was rat by the bat"
暴力解法
对字典里的每一个词根,都要去看看每个单词是否能匹配呢
class Solution(object):def replaceWords(self, dictionary, sentence):words = sentence.split(" ")for root in dictionary:for i in range(len(words)):if root == words[i][:len(root)]:words[i] = rootreturn ' '.join(words)
执行用时:124 ms, 在所有 Python 提交中击败了60.00%的用户
内存消耗:20.9 MB, 在所有 Python 提交中击败了85.71%的用户
通过测试用例:126 / 126
因为数据量比较小,所以没有超时
Hash解法
该解法用到了hash加list的结构
d以26个字母为键,把出现的词根放进首字母键中,因此会有列表出现
{‘c’: [‘catt’, ‘cat’], ‘b’: [‘bat’], ‘r’: [‘rat’]}
s也以26个字母为键,把出现的词根的长度放进对应的键中,并记录最大值
{‘c’: 4, ‘b’: 3, ‘r’: 3}
然后以最大长度为上限遍历,如果该单词的前n个字母出现在d相应的键的列表中,就替换并退出,因为词根重复时只要最短值
class Solution(object):def replaceWords(self, dictionary, sentence):words = sentence.split(" ")d = {}s = {}for w in dictionary:if w[0] in d:d[w[0]].append(w)else:d[w[0]] = []d[w[0]].append(w)if w[0] in s:s[w[0]] = max(s[w[0]], len(w))else:s[w[0]] = len(w)# return d, s# enumerate(words) 同时获得words这个列表的索引和值for i, w in enumerate(words):if w[0] in s :for j in range(s[w[0]]):if words[i][:j + 1] in d[w[0]]:words[i] = w[:j + 1]breakreturn " ".join(words)A = Solution()
print(A.replaceWords(["cat", "bat", "rat"], "the cattle was rattled by the battery"))
print(A.replaceWords(["a", "b", "c"],"aadsfasf absbs bbab cadsfafs"))
print(A.replaceWords(["a", "aa", "aaa", "aaaa"],"a aa a aaaa aaa aaa aaa aaaaaa bbb baba ababa"))
print(A.replaceWords(["catt", "cat", "bat", "rat"],"the cattle was rattled by the battery"))
print(A.replaceWords(["ac", "ab"],"it is abnormal that this solution is accepted"))
the cat was rat by the bat
a a b c
a a a a a a a a bbb baba a
the cat was rat by the bat
it is ab that this solution is ac
感觉没有快多少
执行用时:88 ms, 在所有 Python 提交中击败了71.43%的用户
内存消耗:20.9 MB, 在所有 Python 提交中击败了91.43%的用户
时间复杂度
O(N) 只算遍历句子的长度,字典的长度比句子单词个数少,虽然是两次遍历但是简化为句子的遍历,而Hash表的查找是常数操作
空间复杂度
O(N) 字典的大小
Hash Exercise 21.11.27相关推荐
- 21.11.19 贝卡 宝贝制造者 类星体(手雷) 21.11.26 卢西恩的召唤 惊雷AAA 永田(手雷) 21.12.03 绝对征服 嗜血野兽 传输(手雷) 21.
21.11.19 贝卡 宝贝制造者 类星体(手雷) 21.11.26 卢西恩的召唤 惊雷AAA 永田(手雷) 21.12.03 绝对征服 嗜血野兽 传输(手雷) 21.12.10 垂死之息 某人的财产 ...
- 2022/11/27一周总结
项目 redis 安装以及启动 切换到redis根目录运行cmd,先启动服务端 redis-server.exe 2.输入redis-cli并回车(redis-cli是客户端程序)如图正常提示进入,并 ...
- Oracle11.2.0.4 windows32+64bit path补丁21+11.2.0.4.160419 p22064588 p22839608
2016年6月3日最新补丁-Oracle11.2.0.4 for windows32+64bit,p22064588 patch11.2.0.4.21,p22839608 11.2.0.4.16041 ...
- ##(两个井号)和#(一个井号)都是什么意思C and C++ 2008-09-23 21:18:27 阅读1106 评论0 字号:大中小 订阅 .
##(两个井号)和#(一个井号)都是什么意思 C and C++ 2008-09-23 21:18:27 阅读1106 评论0 字号:大中小 订阅 连接符 ##(两个井号) 不知道什么符 #(一个 ...
- daily scrum 11.27
今日任务 做了什么 明日任务 李嘉良 (18)写换皮肤功能 研究相关技术 开始着手编写代码 王泓洋 (29)优化metro图标 商讨设计图标 修改图标 王熹 (29)优化metro图标 商讨设计图 ...
- HALCON 21.11:学习笔记---OPC_UA(I/O)
HALCON 21.11:学习笔记---OPC_UA(I/O) 本章主要提供有关OPC_UA的信息. 系统要求 Intel compatible PC with Windows 7 (32-bit o ...
- HALCON 21.11:深度学习笔记---语义分割/边缘提取(12)
HALCON 21.11:深度学习笔记---语义分割/边缘提取(12) HALCON 21.11.0.0中,实现了深度学习方法. 本章介绍了如何使用基于深度学习的语义分割,包括训练和推理阶段. 通过语 ...
- HALCON 21.11:深度学习笔记---对象检测, 实例分割(11)
HALCON 21.11:深度学习笔记---对象检测, 实例分割(11) HALCON 21.11.0.0中,实现了深度学习方法. 本章介绍了如何使用基于深度学习的对象检测. 通过对象检测,我们希望在 ...
- HALCON 21.11:深度学习笔记---分类(10)
HALCON 21.11:深度学习笔记---分类(10) HALCON 21.11.0.0中,实现了深度学习方法. 本章介绍了如何在训练和推理阶段使用基于深度学习的分类. 基于深度学习的分类是一种对一 ...
最新文章
- java list 速度_Java中的List你真的会用吗?不会用的话请收藏我的这篇文章
- C#总结项目《汽车租聘系统》项目代码实例【全注释版】
- VisualSVN 备份
- Python程序设计读者群成立通知
- 112654 个招聘数据告诉你,程序员 2019 年该去哪!
- Delphi7串口通讯实例(含Spcomm控件)
- 模糊控制完全理解系列(二)—— 模糊集合论基础之模糊集基础概念
- Ruby on Rails快速创新性能的终极指南
- 全球水储量分布图matlab代码,中国水能资源储量及分布特点分析(图)
- 到底买苹果XS还是XR_iPhone XS和XR买哪个?10个理由告诉你XS更好,贵是有原因的!...
- 「2020总结文章」一起回顾 2020,展望 2021(JesksonUI-UniApp)
- 第三(关于set、file、args)
- Dubbo Failover机制
- 计算机教程文档,计算机应用基础教程-20210323002444.doc-原创力文档
- Redis实现点赞功能
- 三件套都有什么_床上用品三件套,四件套,五件套,七件套分别包括的是哪些...
- C++ 标准库の使用迷思
- COLMAP: Structure-from-Motion Revisited 论文阅读
- Android 的 Activity 教程
- 防范IFEO映像劫持
热门文章
- APP新用户注册、手机号绑定、用户登录验证新方式——一键登录(免密登录)验证方式新趋势
- python直接进行逐步回归_【Python】逐步回归
- 挑战高薪!学习人工智能,你准备好了吗?
- pytorch转onnx踩坑日记
- 安装ao2011 服务器为空,`畅捷通T+`财务数据导入AO2011的解决方法
- Python之Pandas使用知识汇总(持续更新)
- VS2010完美卸载
- centos下面,解压.gar.gz文件
- Docker系列:docker安装zookeeper
- 讲讲“工业4.0”的故事