问题描述
小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:
输入:
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) 将列表转换成字符串。
代码详解
-
字母映射字典
letter_to_digit:- 该字典存储了小写字母和数字的映射关系。通过该字典,我们可以快速地将字母转换为对应的数字。
-
遍历字符串:
- 通过
for char in s遍历输入字符串s中的每个字符。 - 如果字符是小写字母,则直接通过字典查找对应的数字并添加到结果中。
- 如果字符是大写字母,首先将其转换为小写字母,再跳到字母表中的前一个字母。特殊处理
'A'将其转换为'Z',然后查找其对应的数字。 - 对于非字母字符(例如数字和符号),直接将它们添加到结果中。
- 通过
-
生成结果:
- 结果是一个列表
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是字符串的长度。
总结
这道题目考察了字符串遍历和条件判断的基本操作。通过逐个字符的处理,我们可以非常容易地将输入字符串转换成指定的数字密码。