原题如下: 小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。
1. 字符映射规则
-
小写字母:
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
-
大写字母:
- 首先将大写字母转换为小写字母,然后跳到字母表中的前一个字母(A特殊处理为Z)。
- 例如,
B转换为a,再转换为2;A转换为Z,再转换为9。
-
非字母字符:
- 保持不变。
2. 数据结构选择
- 字典:用于存储字母到数字的映射关系,这样可以快速查找。
- 字符串操作:用于遍历输入字符串并处理每个字符。
3. 算法步骤
-
初始化映射字典:
- 创建一个字典来存储小写字母到数字的映射。
-
处理字符串:
-
遍历输入字符串的每个字符。
-
大写字母处理:
-
转换为小写字母:使用
char.lower()方法。 -
跳到前一个字母:
- 如果字符是
A,则将其视为Z(即chr(ord('z')))。 - 否则,使用
chr(ord(char) - 1)将其转换为前一个字母。
- 如果字符是
-
查找映射:使用字典查找小写字母对应的数字。
-
-
小写字母处理:
- 直接查找映射:使用字典查找小写字母对应的数字。
-
非字母字符处理:
- 保持不变,直接添加到结果字符串中。
-
-
返回结果:
- 将处理后的字符拼接成最终的结果字符串。
代码:
`
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.isupper():
# 大写字母转换为小写字母,然后跳到前一个字母
if char == 'A':
char = 'Z'
else:
char = chr(ord(char.lower()) - 1)
# 查找映射
result.append(letter_to_digit[char.lower()])
elif char.islower():
# 直接查找小写字母的映射
result.append(letter_to_digit[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')
`
关键步骤注释
- 初始化映射字典:创建一个字典来存储小写字母到数字的映射。
- 处理字符串:遍历输入字符串的每个字符,根据字符类型进行相应的转换。
- 返回结果:将处理后的字符拼接成最终的结果字符串。