问题描述: 小T设计了一套密码变换规则,将输入的字符串转换成一串数字密码。变换规则如下:小写字母按给定的映射关系转换为对应的数字,大写字母先转为小写字母,再跳到字母表中的前一个字母,并按上述规则转换为对应的数字。非字母字符保持不变。
测试样例: 样例1:
输入:s = "LIming0701" 输出:'5464640701'
样例2:
输入:s = "PassW0rd" 输出:'62778073'
样例3:
输入:s = "helloWORLD123" 输出:'4355686752123'
解题思路:
- 定义小写字母到数字的映射关系。
- 遍历输入字符串中的每个字符,根据字符类型进行不同的转换。
- 对于大写字母,先转换为小写,再找到字母表中的前一个字母,并进行映射。
- 对于小写字母,直接进行映射。
- 对于非字母字符,保持不变。
- 将转换后的字符拼接成最终的数字密码字符串。
解题步骤:
- 定义一个函数
solution,参数为字符串s。 - 初始化一个映射字典
mapping,存储小写字母到数字的映射关系。 - 初始化一个空字符串
result,用于存储转换后的数字密码。 - 遍历输入字符串s中的每个字符。
- 如果字符是大写字母,先转换为小写,再找到字母表中的前一个字母,并进行映射。
- 如果字符是小写字母,直接进行映射。
- 如果字符是非字母字符,保持不变。
- 将转换后的字符添加到
result中。 - 返回
result。
解题代码:
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.isupper():
# 特殊处理A
if char == 'A':
result += '9'
else:
# 转换为小写字母表中的前一个字母
prev_char = chr(ord(char.lower()) - 1)
result += mapping[prev_char]
# 如果字符是小写字母
elif char.islower():
result += mapping[char]
# 如果字符是非字母字符,保持不变
else:
result += char
return result
if __name__ == '__main__':
print(solution(s="LIming0701") == '5464640701')
print(solution(s="PassW0rd") == '62778073')
print(solution(s="helloWORLD123") == '4355686752123')
解题思路详细解析:
- 我们首先定义了一个映射字典
mapping,它包含了小写字母到数字的映射关系。 - 我们初始化了一个空字符串
result,用于存储转换后的数字密码。 - 我们遍历输入字符串
s中的每个字符,并根据字符的类型进行不同的处理。 - 如果字符是大写字母,我们先将其转换为小写,然后找到字母表中的前一个字母,并使用映射关系将其转换为数字。
- 如果字符是小写字母,我们直接使用映射关系将其转换为数字。
- 如果字符是非字母字符,我们保持其不变。
- 我们将转换后的字符添加到
result中。 - 最后,我们返回
result,即转换后的数字密码字符串。
复杂度分析:
时间复杂度:O(n),其中n是输入字符串s的长度。我们需要遍历字符串中的每个字符,并进行常数时间的映射操作。
空间复杂度:O(1),除了输入和输出,我们只使用了常量空间来存储映射字典和结果字符串。