青训营X豆包MarsCode 技术训练营第九课 | 豆包MarsCode AI 刷题

61 阅读6分钟

问题描述

小T设计了一套密码变换规则,将输入的字符串转换成一串数字密码。变换规则如下:

  1. 小写字母按以下映射关系进行转换:
  • 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
  1. 大写字母先转为小写字母,再跳到字母表中的前一个字母,并按上述规则转换为对应的数字。例如,B 转换为 a,再转换为 2A 特殊处理,先变为 Z,再转换为 9
  2. 非字母字符保持不变。

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 码和字符转换的视频教程,然后再回到刷题中加深理解和应用。