小T的密码变换规则 | 豆包MarsCode AI刷题

160 阅读3分钟

原题如下: 小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. 非字母字符保持不变。

例如:对于输入字符串 "LIming0701",转换后的数字密码为 5464640701

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
  • 大写字母

    • 首先将大写字母转换为小写字母,然后跳到字母表中的前一个字母(A特殊处理为Z)。
    • 例如,B 转换为 a,再转换为 2A 转换为 Z,再转换为 9
  • 非字母字符

    • 保持不变。

2. 数据结构选择

  • 字典:用于存储字母到数字的映射关系,这样可以快速查找。
  • 字符串操作:用于遍历输入字符串并处理每个字符。

3. 算法步骤

  1. 初始化映射字典

    • 创建一个字典来存储小写字母到数字的映射。
  2. 处理字符串

    • 遍历输入字符串的每个字符。

    • 大写字母处理

      • 转换为小写字母:使用 char.lower() 方法。

      • 跳到前一个字母:

        • 如果字符是 A,则将其视为 Z(即 chr(ord('z')))。
        • 否则,使用 chr(ord(char) - 1) 将其转换为前一个字母。
      • 查找映射:使用字典查找小写字母对应的数字。

    • 小写字母处理

      • 直接查找映射:使用字典查找小写字母对应的数字。
    • 非字母字符处理

      • 保持不变,直接添加到结果字符串中。
  3. 返回结果

    • 将处理后的字符拼接成最终的结果字符串。

代码:

`

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.isupper():
            # 大写字母转换为小写字母,然后跳到前一个字母
            if char == 'A':
                char = 'Z'
            else:
                char = chr(ord(char.lower()) - 1)
            # 查找映射
            result.append(letter_to_digit[char.lower()])
        elif char.islower():
            # 直接查找小写字母的映射
            result.append(letter_to_digit[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')

`

关键步骤注释

  • 初始化映射字典:创建一个字典来存储小写字母到数字的映射。
  • 处理字符串:遍历输入字符串的每个字符,根据字符类型进行相应的转换。
  • 返回结果:将处理后的字符拼接成最终的结果字符串。