问题描述
小T设计了一套密码变换规则,将输入的字符串转换成一串数字密码。变换规则如下:
- 小写字母按以下映射关系进行转换:
a, b, c->2d, e, f->3g, h, i->4j, k, l->5m, n, o->6p, q, r, s->7t, u, v->8w, x, y, z->9
- 大写字母先转为小写字母,再跳到字母表中的前一个字母,并按上述规则转换为对应的数字。例如,
B转换为a,再转换为2;A特殊处理,先变为Z,再转换为9。 - 非字母字符保持不变。
def solution(s: str) -> str: # 创建小写字母到数字的映射字典 letter_to_digit = { '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' }
# 初始化结果字符串
result = []
# 遍历输入字符串的每个字符
for char in s:
if char.islower():
# 如果是小写字母,直接映射
result.append(letter_to_digit[char])
elif char.isupper():
# 如果是大写字母,先转换为小写字母,再跳到前一个字母
if char == 'A':
# 特殊处理 'A'
result.append(letter_to_digit['z'])
else:
# 其他大写字母
prev_char = chr(ord(char.lower()) - 1)
result.append(letter_to_digit[prev_char])
else:
# 非字母字符保持不变
result.append(char)
# 将结果列表转换为字符串并返回
return ''.join(result)
if __name__ == '__main__':
print(solution(s="LIming0701") == '5464640701')
print(solution(s="PassW0rd") == '62778073')
print(solution(s="helloWORLD123") == '4355686752123')
- **思路**:
- 整体思路是遍历输入字符串的每个字符。对于小写字母,直接根据预定义的映射字典`letter_to_digit`将其转换为对应的数字并添加到结果列表`result`中。对于大写字母,先将其转换为小写字母,然后获取字母表中前一个字母,再通过映射字典得到对应的数字添加到结果列表。非字母字符则直接添加到结果列表。最后将结果列表转换为字符串作为最终输出。
- 例如对于字符串`"LIming0701"`,首先遇到`L`,将其转换为小写`l`,再获取前一个字母`k`,`k`对应的数字是`5`,所以结果列表先添加`5`。接着遇到`I`,转换为小写`i`,对应数字`4`,添加到结果列表,以此类推。
-
代码详解:
-
letter_to_digit字典:创建了小写字母到数字的映射关系,方便后续字符转换时查找对应的数字。 -
遍历字符串:
for char in s:循环逐个处理输入字符串s中的字符。 -
小写字母处理:
if char.islower():分支判断字符是否为小写字母,如果是则直接通过result.append(letter_to_digit[char])将其对应的数字添加到结果列表。 -
大写字母处理:
elif char.isupper():分支处理大写字母。如果是A,通过result.append(letter_to_digit['z'])特殊处理为9。其他大写字母先转换为小写再获取前一个字母,如prev_char = chr(ord(char.lower()) - 1),然后添加到结果列表result.append(letter_to_digit[prev_char])。 -
非字母字符处理:
else:分支处理非字母字符,直接将字符添加到结果列表result.append(char)。 -
最后通过
return ''.join(result)将结果列表转换为字符串返回。
-
知识总结:
-
在这个刷题过程中,复习了字符串的遍历操作,了解了如何通过
for循环逐个访问字符串中的字符。 -
巩固了字符的大小写转换方法,如
char.lower()将大写字符转换为小写,char.upper()反之。 -
学习了如何通过
ord()函数获取字符的 ASCII 码值,以及chr()函数将 ASCII 码值转换回字符,这在处理大写字母转换为前一个字母的操作中非常关键。 -
对于字典的使用有了更深入的理解,特别是在创建映射关系和根据键获取值方面,如
letter_to_digit字典的创建和使用。
对于入门同学的学习建议:
-
要熟悉字符串的基本操作,包括遍历、索引、切片等,这是处理文本相关问题的基础。
-
掌握字符的大小写转换函数以及
ord()和chr()函数的使用,它们在很多字符处理场景中都会用到。 -
理解字典这种数据结构的创建和使用方式,学会根据实际需求构建合适的映射关系。
学习计划:
-
制定刷题计划:
- 可以按照题目类型进行分类刷题,例如先集中练习字符串处理相关题目,像本题这种字符转换的,然后再练习其他类型如列表操作、数学计算等。
- 设定每天的刷题量,比如每天完成 3 - 5 道题目,确保有足够的时间理解题目思路、编写代码和分析错误。
- 定期回顾之前做过的题目,比如每周进行一次错题回顾和总结,加深对知识点的记忆。
-
利用错题进行针对性学习:
-
当遇到错题时,不要急于看答案,先自己分析错误原因,尝试重新编写代码解决问题。
-
将错题整理到错题本中,记录错误的原因、正确的解法以及涉及到的知识点,方便复习时重点关注。
-
针对错题涉及的知识点,进行额外的学习和练习,可以查找相关资料或者做一些类似的练习题来巩固。
-
-
可以将 AI 刷题功能与在线编程学习平台相结合。例如在完成 AI 刷题后,将代码提交到在线编程平台进行更多样化的测试,包括不同的测试用例和边界情况的检测,以确保代码的正确性和稳定性。
-
与学习笔记软件搭配使用。在刷题过程中,将重要的知识点、代码片段、解题思路等记录到学习笔记软件中,方便随时复习和总结。同时可以在笔记中添加超链接,链接到相关的 AI 刷题题目或者在线学习资源,便于知识的整合和关联。
-
利用视频教程资源辅助学习。当在 AI 刷题中遇到难以理解的概念或者算法时,查找对应的视频教程进行观看学习。例如对于字符编码相关知识,可以观看专门讲解 ASCII 码和字符转换的视频教程,然后再回到刷题中加深理解和应用。