2024-1-8,卡码网第18题开房门
目录
前言
本题属于哈希表系列的第三题,也是能够实现哈希表的三种数据类型中的最后一种—— 字典 。在前两篇博客中,已经介绍了列表和集合两种数据类型,这次引入了真正的哈希表,字典(正统)。
1. 题目描述
已知你拥有一串钥匙,钥匙数量已知,钥匙上面有对应房门的编号;再给你相同数量的房门,房门上同样有编号,但不一定和钥匙上的编号一样。现在,需要打开已知编号的房门,通过编程判断手中的这串钥匙是否含有打开房门时需要的那把,即根据给定编号,找到给定编号的钥匙是否存在。
2. 代码实现
这道题使用哈希表是最适合的方法,因为哈希表很擅长查询和统计,前两题也是实现查询和统计。但是,需要使用全新的数据类型(字典)。所以,首先必须弄明白什么是字典?字典可以怎么使用?字典中存储的数据有什么特点?对此,以下一一解答。
2.1 字典(第一类map映射)
将数据存储为键(key)---值(value)对的数据结构,通常被称为映射(Map)。这种映射通过键来关联值,使得你可以通过键快速查找和访问对应的值。在不同的编程语言中,这种数据结构可能有不同的名称,例如:
- Python 中称为字典(Dictionary)
- Java 中称为映射(Map)
- JavaScript 中称为对象(Object)
- C++ 中称为关联容器(Associative Container)如
std::map
或std::unordered_map
那么,在python中什么是字典?字典,就是在 python 中的 map 映射。字典中存放的就是一对对键值对,以下代码创建了一个实例展示字典的创建、更新指定的值和添加新的键值对。在字典中,键是不可变的数据类型(在例子中,只能更新值,不能更新键)。
# 创建一个字典
my_dict = {'name': 'John', 'age': 25, 'city': 'New York'}
# 通过键访问值
print(my_dict['name']) # 输出: John
print(my_dict['age']) # 输出: 25
print(my_dict['city']) # 输出: New York
# 更新值
my_dict['age'] = 26 # 更新 'age' 的值
my_dict['gender'] = 'Male' # 添加新的键值对
# 打印更新后的字典
print(my_dict)
# 输出: {'name': 'John', 'age': 26, 'city': 'New York', 'gender': 'Male'}
2.2 具体代码
具体代码如下:
有一个要注意的细节就是,创建一个布尔值反映有没有找到对应的那把钥匙。这样写的目的就是能够将代码中找钥匙的逻辑理清楚。
n = int(input()) #每个键值对占一行,一共有n行
dict = {} #创建一个空字典
# 将键值对添加进字典
for _ in range(n):
key, door = map(int, input().split())
dict[key] = door
x = int(input()) #读取需要查询的房门编号
flag = True
#一个布尔值,找到钥匙,值为false,则不输出最后一行代码;找不到,值为true,输出最后一行代码
# 遍历字典,查询指定的房门编号是否存在
for key, value in dict.items():
if value == x:
print(key)
flag = False
break
# 若不存在,输出语句
if flag:
print("Can't open the door.")
这里面有一个上面没讲过的函数 items。函数 items 就是查询字典中的所有键值对,与 for 循环一起用就能遍历整个字典的键值对。下面这句代码,就是将字典的一对键值对分别赋值给 key 和 value ,然后循环直到遍历结束。
for key, value in dict.items():
3. 总结
这样,通过三道题就能够把 python 中与哈希表有关的三种数据类型(列表,集合,字典)的基础概念完全弄明白了。键值对,是在做有关查询类的题目时,或许是一个非常不错的方法。如需要查看上两篇,这边直接放上链接。
第16题 出现频率最高的字母http://t.csdnimg.cn/JiSiK第17题 判断集合成员http://t.csdnimg.cn/kWCtj
本人所用代码编辑器为 VS Code,刷题网站为卡码网