1. 题目描述
小T的密码变换规则
问题描述
小T设计了一套密码变换规则,将输入的字符串转换成一串数字密码。变换规则如下:
- 小写字母按以下映射关系进行转换:
a, b, c
->2
d, e, f
->3
g, h, i
->4
j, k, l
->5
m, n, o
->6
p, q, r, s
->7
t, u, v
->8
w, x, y, z
->9
- 大写字母先转为小写字母,再跳到字母表中的前一个字母,并按上述规则转换为对应的数字。例如,
B
转换为a
,再转换为2
;A
特殊处理,先变为Z
,再转换为9
。 - 非字母字符保持不变。
例如:对于输入字符串 "LIming0701"
,转换后的数字密码为 5464640701
。
测试样例
样例1:
输入:
s = "LIming0701"
输出:'5464640701'
样例2:
输入:
s = "PassW0rd"
输出:'62778073'
样例3:
输入:
s = "helloWORLD123"
输出:'4355686752123'
2. 分析
- 遍历字符串,判断每个字符:
- 如果是数字,就直接拼接;
- 如果是小写字母,找到对应的数字后把数字拼接到结果上;
- 如果是大写字母,找到其小写字母的前一个字母(A应该找z)对应的数字后拼接;
3. 实现
def isupper(s:str)->bool:
return s.upper()==s
def islower(s:str)->bool:
return s.lower()==s
map_dict = {
'a': '2', 'b': '2', 'c': '2',
'd': '3', 'e': '3', 'f': '3',
'g': '4', 'h': '4', 'i': '4',
'j': '5', 'k': '5', 'l': '5',
'm': '6', 'n': '6', 'o': '6',
'p': '7', 'q': '7', 'r': '7', 's': '7',
't': '8', 'u': '8', 'v': '8',
'w': '9', 'x': '9', 'y': '9', 'z': '9'
}
def solution(s: str) -> str:
# write code here
res=''
for c in s:
if c.isdigit():
res+=c
elif islower(c):
res+=map_dict[c]
else:
if c=='A':
res+=map_dict['z']
else:
res+=map_dict[chr(ord(c.lower())-1)]
return res
4. 题目总结
1. 理解题目要求
- 关键点:在刷题时,首先要确保完全理解题目的要求,理清要做什么。对于复杂的转换规则,可以先手动模拟几个简单的例子,以便理解每一步的逻辑;
2. 选择合适的数据结构
- 字典:适用于需要通过
key
快速查找对应的value
的场景,和遍历列表相比速度更快; - 字符串:结果字符串用于存储最终的转换结果,逐个字符处理并拼接;
3. 逐步实现算法
- 遍历字符串:通过遍历输入字符串的每个字符,根据字符的类型进行相应的处理;
- 条件判断:使用条件判断来区分数字、小写字母、大写字母和非字母字符,并进行相应的转换;
4. 测试和调试
- 测试用例:编写多个测试用例,确保代码在各种情况下都能正确运行;
- 调试:如果遇到问题,可以打上断点,通过MarsCode刷题平台自带的调试功能进行调试,逐步检查代码的执行过程,找出问题所在;
- 常用的builtins还是要记的
- 比如本题中的
ord
和chr
5. 刷题总结
- 多总结、及时复盘
- 总结:每次刷题后,总结解题思路和实现方法,记录下遇到的问题、思考过程和解决方法,总结这类题型对应的解题套路;
- 复盘:尝试重新做一遍题,看是否能在不借助AI的情况下独立完成,并反思在解题过程中的不足之处,比如是否遗漏了某些情况,是否可以优化代码等;制定合适的刷题计划,循序渐进;
2. 注重练习广度、深度和持久度
- 广度:尝试不同题型,锻炼自己的思维转换能力和代码实现能力;
- 深度:逐步挑战更难的题目,提升自己的编程水平,用好AI工具,在完全没有思路时可以让AI先给个思路提示,再尝试自己写;
- 持久度:忌三天打鱼两天晒网,防止生疏;
- 使用工具
- 善用MarsCode 刷题平台的调试功能,多调试追踪运行步骤;
- 遇到题目一段时间还是没思路(5min?),尝试让AI分析并给出思路,在此基础上尝试解答;使用AI给出优化、完善的建议;