小T的密码变换规则
问题描述:
小T设计了一套密码变换规则,将输入的字符串转换成一串数字密码。变换规则如下:
- 小写字母按以下映射关系进行转换:
- 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
- 大写字母先转为小写字母,再跳到字母表中的前一个字母,并按上述规则转换为对应的数字。例如,B 转换为 a,再转换为 2;A 特殊处理,先变为 Z,再转换为 9。
- 非字母字符保持不变。
例如:对于输入字符串 "LIming0701",转换后的数字密码为 5464640701。
处理步骤:
- 对于每个字符,我们需要判断它是小写字母、大写字母还是非字母字符。
- 如果是小写字母,我们可以直接通过映射得到数字。
- 如果是大写字母,先将其转换为小写字母,然后“跳到前一个字母”,再根据规则进行转换。
- 对于非字母字符,直接添加到结果字符串中。
映射规则的实现:
小写字母与数字之间的映射是基于字母表的位置,因此我们可以通过字符的 ASCII 值来计算它对应的数字。
代码实现:
def solution(s: str) -> str:
# 定义小写字母到数字的映射规则
def char_to_digit(ch: str) -> str:
if 'a' <= ch <= 'c':
return '2'
elif 'd' <= ch <= 'f':
return '3'
elif 'g' <= ch <= 'i':
return '4'
elif 'j' <= ch <= 'l':
return '5'
elif 'm' <= ch <= 'o':
return '6'
elif 'p' <= ch <= 's':
return '7'
elif 't' <= ch <= 'v':
return '8'
elif 'w' <= ch <= 'z':
return '9'
result = []
for char in s:
if 'a' <= char <= 'z': # 小写字母
result.append(char_to_digit(char))
elif 'A' <= char <= 'Z': # 大写字母
# 将大写字母转换为小写字母,并跳到前一个字母
if char == 'A':
result.append('9') # 特殊处理A
else:
# 转为小写并跳到前一个字母
prev_char = chr(ord(char.lower()) - 1)
result.append(char_to_digit(prev_char))
else: # 非字母字符
result.append(char)
return ''.join(result)
if name == 'main':
# 测试用例
print(solution(s="LIming0701") == '5464640701') # 应输出 '5464640701'
print(solution(s="PassW0rd") == '62778073') # 应输出 '62778073'
print(solution(s="helloWORLD123") == '4355686752123') # 应输出 '4355686752123'
代码解析:
- char_to_digit 函数:该函数接收一个小写字母并返回对应的数字字符。我们根据字母的范围将其映射到数字。
- 遍历输入字符串:对于每个字符:
-
- 如果是小写字母,直接通过 char_to_digit 获取数字并添加到结果中。
- 如果是大写字母,先转为小写字母并跳到前一个字母(除了 A 特殊处理为 Z)。然后使用 char_to_digit 函数转换为数字。
- 如果是非字母字符,直接添加到结果中。
- 最后,我们将结果列表转换为字符串并返回。