卡码网语言基础课 | 18. 开房门 | 刷题心得

2024-1-8,卡码网第18题开房门


目录

1. 题目描述

2. 代码实现

2.1 字典

2.2 具体代码

3. 总结


前言

本题属于哈希表系列的第三题,也是能够实现哈希表的三种数据类型中的最后一种—— 字典 。在前两篇博客中,已经介绍了列表集合两种数据类型,这次引入了真正的哈希表,字典(正统)

1. 题目描述

已知你拥有一串钥匙,钥匙数量已知,钥匙上面有对应房门的编号;再给你相同数量的房门,房门上同样有编号,但不一定和钥匙上的编号一样。现在,需要打开已知编号的房门,通过编程判断手中的这串钥匙是否含有打开房门时需要的那把,即根据给定编号,找到给定编号的钥匙是否存在

2. 代码实现

这道题使用哈希表是最适合的方法,因为哈希表很擅长查询和统计,前两题也是实现查询和统计。但是,需要使用全新的数据类型(字典。所以,首先必须弄明白什么是字典?字典可以怎么使用?字典中存储的数据有什么特点?对此,以下一一解答。

2.1 字典(第一类map映射)

将数据存储为键(key)---值(value)对的数据结构,通常被称为映射(Map)。这种映射通过键来关联值,使得你可以通过键快速查找和访问对应的值。在不同的编程语言中,这种数据结构可能有不同的名称,例如:

  • Python 中称为字典(Dictionary)
  • Java 中称为映射(Map)
  • JavaScript 中称为对象(Object)
  • C++ 中称为关联容器(Associative Container)如 std::mapstd::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题 出现频率最高的字母icon-default.png?t=N7T8http://t.csdnimg.cn/JiSiK第17题 判断集合成员icon-default.png?t=N7T8http://t.csdnimg.cn/kWCtj


本人所用代码编辑器为 VS Code,刷题网站为卡码网


卡码网icon-default.png?t=N7T8https://kamacoder.com/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴风雨使我安睡2580

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值