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

105 阅读5分钟

问题描述

小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:

输入:s = "LIming0701"
输出:'5464640701'

样例2:

输入:s = "PassW0rd"
输出:'62778073'

样例3:

输入:s = "helloWORLD123"
输出:'4355686752123'

题目解析

这道题是个简单题,没有绕弯子,比较直接,在这个问题中,目的是将输入的字符串按照特定规则转换为数字密码。字符串中的字母根据给定规则映射为数字,而非字母字符保持不变。

题目给定的映射规则中,针对小写字母和大写字母有不同的处理方法,而对于数字和其他符号,则直接保留。

完整代码

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':
                lower_char = 'z'
            else:
                lower_char = chr(ord(char.lower()) - 1)
            # 获取转换后的数字
            result.append(letter_to_digit[lower_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')
1. 字母到数字的映射

题目中给出的字母和数字的映射非常清楚。小写字母直接按照映射规则转换,而大写字母需要先转换成小写,并跳到字母表中的前一个字母。对于大写字母 'A',则有特殊处理,先变为 'Z'

2. 循环遍历字符串中的每个字符

在字符串中每个字符的处理方式如下:

  • 小写字母:直接从字典中查找对应的数字。
  • 大写字母:先将其转化为小写,并跳到前一个字母,之后从字典中查找对应的数字。
  • 非字母字符:直接保留原字符。
3. 结果的存储

为了将转换后的字符存储并最终输出,我们使用一个列表 result 来逐个存储字符,并最终通过 ''.join(result) 将列表转换成字符串。

代码详解

  1. 字母映射字典 letter_to_digit

    • 该字典存储了小写字母和数字的映射关系。通过该字典,我们可以快速地将字母转换为对应的数字。
  2. 遍历字符串

    • 通过 for char in s 遍历输入字符串 s 中的每个字符。
    • 如果字符是小写字母,则直接通过字典查找对应的数字并添加到结果中。
    • 如果字符是大写字母,首先将其转换为小写字母,再跳到字母表中的前一个字母。特殊处理 'A' 将其转换为 'Z',然后查找其对应的数字。
    • 对于非字母字符(例如数字和符号),直接将它们添加到结果中。
  3. 生成结果

    • 结果是一个列表 result,我们通过 result.append() 将每个转换后的字符添加到列表中。
    • 最终,使用 ''.join(result) 将列表转换为一个字符串。

测试用例

print(solution(s="LIming0701") == '5464640701')  # 输出:'5464640701'
print(solution(s="PassW0rd") == '62778073')     # 输出:'62778073'
print(solution(s="helloWORLD123") == '4355686752123')  # 输出:'4355686752123'
  • 样例 1"LIming0701" 应该被转换为 '5464640701'
  • 样例 2"PassW0rd" 应该被转换为 '62778073'
  • 样例 3"helloWORLD123" 应该被转换为 '4355686752123'

时间复杂度

  • 对于每个字符,我们进行常数时间的查找、计算或转换。因此,时间复杂度为 O(n),其中 n 是字符串的长度。

总结

这道题目考察了字符串遍历和条件判断的基本操作。通过逐个字符的处理,我们可以非常容易地将输入字符串转换成指定的数字密码。