1. 题目理解
题目要求我们实现一个函数 solution(s: str) -> str,该函数将输入的字符串 s 转换成一串数字密码。转换规则如下:
- 小写字母映射:小写字母
a, b, c映射到2,d, e, f映射到3,依此类推,直到w, x, y, z映射到9。 - 大写字母映射:大写字母先转为小写字母,再跳到字母表中的前一个字母,并按上述规则转换为对应的数字。例如,
B转换为a,再转换为2;A特殊处理,先变为Z,再转换为9。 - 非字母字符:非字母字符保持不变。
2. 数据结构选择
为了高效地进行字母到数字的映射,我们选择使用字典(Python 中的 dict)来存储小写字母到数字的映射关系。字典的键为小写字母,值为对应的数字。
代码实现:
lower_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' }
3. 算法步骤
-
初始化结果列表:我们使用一个列表
result来存储转换后的字符。 -
遍历输入字符串:我们遍历输入字符串
s中的每个字符。 -
处理小写字母:如果字符是小写字母,直接从映射表
lower_to_digit中获取对应的数字,并将其添加到result列表中。 -
处理大写字母:如果字符是大写字母,先将其转换为小写字母,然后跳到字母表中的前一个字母。具体步骤如下:
- 如果字符是
A,则将其转换为z。 - 否则,将其转换为小写字母,然后通过
ord()函数获取其 ASCII 码,减去 1 后再通过chr()函数转换回字符。 - 最后,从映射表
lower_to_digit中获取对应的数字,并将其添加到result列表中。
- 如果字符是
-
处理非字母字符:如果字符不是字母,直接将其添加到
result列表中。 -
返回结果:最后将
result列表拼接成字符串并返回。
4. 代码实现
def solution(s: str) -> str: # 定义小写字母到数字的映射 lower_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(lower_to_digit[char])
elif char.isupper():
# 大写字母先转为小写字母,再跳到字母表中的前一个字母
if char == 'A':
prev_char = 'z'
else:
prev_char = chr(ord(char.lower()) - 1)
result.append(lower_to_digit[prev_char])
else:
# 非字母字符保持不变
result.append(char)
return ''.join(result)
5. 代码分析
- 时间复杂度:该算法的时间复杂度为 O(n),其中 n 是输入字符串的长度。我们只需遍历一次输入字符串,并对每个字符进行常数时间的操作(查找字典、ASCII 码转换等)。
- 空间复杂度:该算法的空间复杂度为 O(n),主要用于存储结果列表
result。
6. 测试与验证
为了确保代码的正确性,我们在 if __name__ == '__main__': 块中添加了几个测试用例,并打印出结果以进行验证。这些测试用例包括:
"LIming0701"应该转换为"5464640701"。"PassW0rd"应该转换为"62778073"。"helloWORLD123"应该转换为"4355686752123"。
通过这些测试用例,我们可以验证代码是否正确地实现了题目要求的转换规则。
7. 总结
本题的核心在于理解并实现字母到数字的映射规则,特别是大写字母的处理。通过使用字典来存储映射关系,我们可以高效地进行查找和转换。遍历输入字符串并根据字符类型进行相应的处理,最终将结果拼接成字符串返回。