小T的密码变换规则
题目内容如下:
解题思路如下:
(1)将每个字符单独处理,分类讨论:小写字母、大写字母、非字母字符。
(2)对于小写字母,直接按映射表转换。
(3)对于大写字母,先将其转换为小写,再转到字母表中的前一个字母,然后按小写字母规则处理。
(4)非字母字符保持不变。
(5)特殊处理:对于字符“A”,先变为“z”,再转换成“9”
映射表: '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'
根据上述解题思路,我们可以先实现“对不同字符的处理”的辅助函数convert(char),toDigit函数映射规则,再在solution函数中遍历字符串s,初始化一个字符串ans = '',用于逐个拼接转换后的字符。
代码实现
function toDigit(letter) {
// 小写字母到数字的映射规则
// 映射表
const 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' };
return mapping[letter] || letter;
}
function convert(char) {
// 判断字符类型并进行转换
if (char >= 'a' && char <= 'z') {
return toDIgit(char);
} else if (char >= 'A' && char <= 'Z') {
if (char === 'A') {
return '9'; // 特殊处理 A -> z -> 9
}
// 转为小写并取前一个字母
let lowerChar = String.fromCharCode(char.toLowerCase().charCodeAt(0) - 1);
return toDigit(lowerChar);
} else {
return char; // 非字母字符保持不变
}
function solution(s){
let ans = ''
for (let i = 0; i < s.length; i++) {
ans += convert(s[i])
}
return ans;
}
代码分析: 优点: 清晰模块化:使用辅助函数和分步骤逻辑,使得代码结构清晰,易于理解。
高效映射:通过哈希表存储字母到数字的映射,使查找操作在 O(1) 时间内完成。
易于扩展:如果需要更改映射规则,只需调整 ToDigit 函数内的映射表。
convert函数简化了大写字母的转换逻辑,能够避免重复调用toLowerCase()和charCodeAt()两个函数
复杂度分析:
时间复杂度: 在solution函数中,我们使用一个for循环用于遍历字符串s,可知该算法的时间复杂度为O(n)。
空间复杂度: 额外使用了一个ans用于存储转换后的结果,可知空间复杂度为O(n)。
总结与心得:
在这道题中,我们通过实现字符到数字的映射规则,将输入字符串转换成数字密码。题目规则细致而繁琐,需要对大小写字母分别处理。尤其是大写字母,需要先转换为小写再向前跳一个字母,其中对字母 "A" 有特殊处理,这使得代码逻辑更为复杂。实现时,关键在于将各类字符的规则清晰分离,如小写字母、大写字母和非字母字符,通过映射表快速查找数字值,保证代码的简洁和高效性。通过这种方式,不仅能加深对字符串处理的理解,还能锻炼我们将复杂逻辑模块化、分步骤处理的能力,从而编写出更具可读性和维护性的代码。