写笔记一是为了督促自己学习(要不真的一瘫瘫一天,学不了一点),
二是给自己的学习留下痕迹,以后再翻看起来,都是自己进步的痕迹,
三是为了再复习的时候好找,把题解分析整理一下,帮助自己理清思路,条理清晰。
如果有需要的就跟我一起打卡备战吧,欢迎一起评论讨论!!!
一、哈希表基础知识
哈希(Hash)是一种将任意长度的输入输入数据映射为固定长度输出数据的算法。
哈希表通常是通过字典(dict
)来实现的。Python的字典是一种基于哈希表的数据结构,它使用哈希函数将键映射到存储值的位置。
以下是用字典的键值对实现哈希表的基本用法
# 创建哈希表 通过字典实现
hash_table = {}
# 插入键值对
hash_table['name'] = 'zhou'
hash_table['age'] = 22
hash_table['city'] = 'New York'
# 访问值
print(hash_table['name']) # 输出 zhou
print(hash_table['age']) # 输出 22
print(hash_table['city']) # 输出 New York
# 检查键是否存在
if 'gender' in hash_table:
print(hash_table['gender'])
else:
print("key not found!") # 输出 key not foud!
# 删除键值对
del hash_table['age']
# 遍历哈希表
for key, value in hash_table.items():
print(f'{key}:{value}')
# 获取所有键或所有值
keys = list(hash_table.keys())
values = list(hash_table.values())
二、练习题目
力扣中的题
三、详细题解
大佬题解:
class Solution: def canConstruct(self, ransomNote: str, magazine: str) -> bool: # 使用字典记录 magazine 中每个字符的出现次数 char_count = {} for char in magazine: char_count[char] = char_count.get(char, 0) + 1 # 遍历 ransomNote 中的字符,逐个减少字典中对应字符的次数 for char in ransomNote: if char_count.get(char, 0) <= 0: # magazine 中没有足够的字符来构成 ransomNote return False char_count[char] -= 1 # 所有字符都能在 magazine 中找到足够次数 return True 作者:fdvoid0 链接:https://leetcode.cn/problems/ransom-note/solutions/2594634/python3gozi-dian-bian-li-zi-fu-xiang-xi-gkg8z/ 来源:力扣(LeetCode)
代码解释:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
这段代码是一个 Python 类中的方法,名为 canConstruct
。这个方法用于判断是否可以用杂志(magazine
)中的字符构建勒索信(ransomNote
)
主要步骤如下:
-
创建一个空字典
char_count
,用于统计每个字符在杂志中出现的次数。 -
使用一个循环遍历
magazine
中的每个字符,并将其出现次数记录在char_count
中。 -
使用另一个循环遍历
ransomNote
中的每个字符,检查是否杂志中有足够的该字符以构建勒索信。如果缺少任何字符,方法返回False
;否则,返回True
。
这个方法基于字符出现次数的比较,判断是否可以使用杂志中的字符构建勒索信。
char_count[char] = char_count.get(char, 0) + 1
这行代码是用来统计一个字符串中每个字符出现的次数。
1. `char_count`: 这是一个字典(dictionary),用于存储每个字符和其出现次数的映射关系。
2. `[char]`: 这是字典中的键,表示当前处理的字符。
3. `char_count.get(char, 0)`: 这是一个字典的方法,用于获取字典中指定键(即字符)对应的值(即该字符出现的次数)。如果字典中不存在这个键,`get` 方法会返回默认值,这里默认值是 0。
4. `char_count[char] = char_count.get(char, 0) + 1`: 这一行代码的目的是将当前字符(char)添加到字典中,并将其对应的值(即出现次数)加一。如果字典中已经有这个字符的记录,就将其出现次数加一;如果字典中没有这个字符的记录,就将其记录为 1。
因此,这行代码实现了一个简单的字符计数功能。在处理一个字符串时,它会遍历字符串的每个字符,统计每个字符出现的次数,并将结果存储在字典 `char_count` 中。
if char_count.get(char, 0) <= 0:
这行代码是在检查一个字符在杂志中的出现次数是否足够构建勒索信。
`char_count.get(char, 0)`: 这是字典 `char_count` 的方法,用于获取字典中指定键(即字符 `char`)对应的值(即该字符在杂志中的出现次数)。如果字典中不存在这个键,`get` 方法会返回默认值,这里默认值是 0。
`<= 0`: 这是一个比较操作符,检查获取到的字符出现次数是否小于或等于零。
因此,整个条件语句的含义是,如果一个字符在杂志中的出现次数不足以构建勒索信(即出现次数小于或等于零),则条件成立。在这种情况下,代码块内的逻辑将执行,通常会导致返回 `False`,表明不能构建勒索信。如果字符的出现次数足够,条件不成立,继续检查下一个字符。
char_count[char] -= 1
表示该字符已经使用过一次了,相应的出现次数要被减一。
四、总结
如果不用哈希表我觉得用 in 也可以,但是只能满足一些比较简单的测试用例,复杂的可能会报错,而且满足不了题目中每个字符只能用一次。所以还是好好学习哈希表的用法吧。先学习一下大佬的解法 ,慢慢的以后精进自己的功力吧哈哈哈哈。