分类:方向一:学习方法与心得-题目解析
问题描述
小T设计了一套密码变换规则,将输入的字符串转换成一串数字密码。变换规则如下:
- 小写字母按以下映射关系进行转换:
a, b, c->2d, e, f->3g, h, i->4j, k, l->5m, n, o->6p, q, r, s->7t, u, v->8w, x, y, z->9
- 大写字母先转为小写字母,再跳到字母表中的前一个字母,并按上述规则转换为对应的数字。例如,
B转换为a,再转换为2;A特殊处理,先变为Z,再转换为9。 - 非字母字符保持不变。
例如:对于输入字符串 "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')
最后提交代码,运行用例,全部测试通过