题解:小T的密码变换规则

109 阅读4分钟

1. 题目理解

题目要求我们实现一个函数 solution(s: str) -> str,该函数将输入的字符串 s 转换成一串数字密码。转换规则如下:

  1. 小写字母映射:小写字母 a, b, c 映射到 2d, e, f 映射到 3,依此类推,直到 w, x, y, z 映射到 9
  2. 大写字母映射:大写字母先转为小写字母,再跳到字母表中的前一个字母,并按上述规则转换为对应的数字。例如,B 转换为 a,再转换为 2A 特殊处理,先变为 Z,再转换为 9
  3. 非字母字符:非字母字符保持不变。

2. 数据结构选择

为了高效地进行字母到数字的映射,我们选择使用字典(Python 中的 dict)来存储小写字母到数字的映射关系。字典的键为小写字母,值为对应的数字。

代码实现:

lower_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' }

3. 算法步骤

  1. 初始化结果列表:我们使用一个列表 result 来存储转换后的字符。

  2. 遍历输入字符串:我们遍历输入字符串 s 中的每个字符。

  3. 处理小写字母:如果字符是小写字母,直接从映射表 lower_to_digit 中获取对应的数字,并将其添加到 result 列表中。

  4. 处理大写字母:如果字符是大写字母,先将其转换为小写字母,然后跳到字母表中的前一个字母。具体步骤如下:

    • 如果字符是 A,则将其转换为 z
    • 否则,将其转换为小写字母,然后通过 ord() 函数获取其 ASCII 码,减去 1 后再通过 chr() 函数转换回字符。
    • 最后,从映射表 lower_to_digit 中获取对应的数字,并将其添加到 result 列表中。
  5. 处理非字母字符:如果字符不是字母,直接将其添加到 result 列表中。

  6. 返回结果:最后将 result 列表拼接成字符串并返回。

4. 代码实现

def solution(s: str) -> str: # 定义小写字母到数字的映射 lower_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(lower_to_digit[char])
    elif char.isupper():
        # 大写字母先转为小写字母,再跳到字母表中的前一个字母
        if char == 'A':
            prev_char = 'z'
        else:
            prev_char = chr(ord(char.lower()) - 1)
        result.append(lower_to_digit[prev_char])
    else:
        # 非字母字符保持不变
        result.append(char)

return ''.join(result)

5. 代码分析

  • 时间复杂度:该算法的时间复杂度为 O(n),其中 n 是输入字符串的长度。我们只需遍历一次输入字符串,并对每个字符进行常数时间的操作(查找字典、ASCII 码转换等)。
  • 空间复杂度:该算法的空间复杂度为 O(n),主要用于存储结果列表 result

6. 测试与验证

为了确保代码的正确性,我们在 if __name__ == '__main__': 块中添加了几个测试用例,并打印出结果以进行验证。这些测试用例包括:

  1. "LIming0701" 应该转换为 "5464640701"
  2. "PassW0rd" 应该转换为 "62778073"
  3. "helloWORLD123" 应该转换为 "4355686752123"

通过这些测试用例,我们可以验证代码是否正确地实现了题目要求的转换规则。

7. 总结

本题的核心在于理解并实现字母到数字的映射规则,特别是大写字母的处理。通过使用字典来存储映射关系,我们可以高效地进行查找和转换。遍历输入字符串并根据字符类型进行相应的处理,最终将结果拼接成字符串返回。