伴学笔记 | 豆包MarsCode AI刷题

26 阅读3分钟

小T的密码变换规则

问题描述:

小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,再转换为 2;A 特殊处理,先变为 Z,再转换为 9。
  2. 非字母字符保持不变。

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

处理步骤:

  • 对于每个字符,我们需要判断它是小写字母、大写字母还是非字母字符。
  • 如果是小写字母,我们可以直接通过映射得到数字。
  • 如果是大写字母,先将其转换为小写字母,然后“跳到前一个字母”,再根据规则进行转换。
  • 对于非字母字符,直接添加到结果字符串中。

映射规则的实现:

小写字母与数字之间的映射是基于字母表的位置,因此我们可以通过字符的 ASCII 值来计算它对应的数字。

代码实现:

def solution(s: str) -> str:

    # 定义小写字母到数字的映射规则

    def char_to_digit(ch: str) -> str:

        if 'a' <= ch <= 'c':

            return '2'

        elif 'd' <= ch <= 'f':

            return '3'

        elif 'g' <= ch <= 'i':

            return '4'

        elif 'j' <= ch <= 'l':

            return '5'

        elif 'm' <= ch <= 'o':

            return '6'

        elif 'p' <= ch <= 's':

            return '7'

        elif 't' <= ch <= 'v':

            return '8'

        elif 'w' <= ch <= 'z':

            return '9'

 

    result = []

 

    for char in s:

        if 'a' <= char <= 'z':  # 小写字母

            result.append(char_to_digit(char))

        elif 'A' <= char <= 'Z':  # 大写字母

            # 将大写字母转换为小写字母,并跳到前一个字母

            if char == 'A':

                result.append('9')  # 特殊处理A

            else:

                # 转为小写并跳到前一个字母

                prev_char = chr(ord(char.lower()) - 1)

                result.append(char_to_digit(prev_char))

        else:  # 非字母字符

            result.append(char)

 

    return ''.join(result)

 

if name == 'main':

    # 测试用例

    print(solution(s="LIming0701") == '5464640701')  # 应输出 '5464640701'

    print(solution(s="PassW0rd") == '62778073')  # 应输出 '62778073'

    print(solution(s="helloWORLD123") == '4355686752123')  # 应输出 '4355686752123'

代码解析:

  1. char_to_digit 函数:该函数接收一个小写字母并返回对应的数字字符。我们根据字母的范围将其映射到数字。
  2. 遍历输入字符串:对于每个字符:
    • 如果是小写字母,直接通过 char_to_digit 获取数字并添加到结果中。
    • 如果是大写字母,先转为小写字母并跳到前一个字母(除了 A 特殊处理为 Z)。然后使用 char_to_digit 函数转换为数字。
    • 如果是非字母字符,直接添加到结果中。
  3. 最后,我们将结果列表转换为字符串并返回。