字节青训营题目之小T的密码变换规则 | 豆包MarsCode AI刷题

64 阅读2分钟

分类:方向一:学习方法与心得-题目解析

问题描述

小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

思路分析

这个问题是关于字符串转换的。我们需要把问题拆解成针对小写字母、大写字母和非字母分别处理

一、小写字母处理

因为我们用的是python语言,可以掉包来实现对小写字母的判断 用char.islower()判断是否为小写字母。 再定义一个字典,这个字典就是题目中小写字母对数字的映射形式。通过查字典来确定小写字母对应的数字。

二、大写字母处理

其实把大写字母写进字典里面也是可行的,只是这么做的话 用char.isupper()判断是否为小写字母。 再转换成小写字母,其中,按照题目要求,A需要经过特殊处理特殊处理,即A转化的不是a,是小写字母z 最后,通过查字典来确定小写字母对应的数字。

三、非字母处理

根据题目的描述,对于数字,无需转换。而输入中没有特殊字符,也不需要考虑对特殊字符的转化情况

代码实现

def solution(s: str) -> str:
    mapping = {
        '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(mapping[char])
        elif char.isupper():
            if char == 'A':
                lower_char = 'z'
            else:
                lower_char = chr(ord(char.lower()) - 1)
            result.append(mapping[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')

最后提交代码,运行用例,全部测试通过