小T的密码变换规则|豆包MarsCode AI刷题

85 阅读3分钟

小T的密码变换规则

题目内容如下: image.png

解题思路如下:

(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" 有特殊处理,这使得代码逻辑更为复杂。实现时,关键在于将各类字符的规则清晰分离,如小写字母、大写字母和非字母字符,通过映射表快速查找数字值,保证代码的简洁和高效性。通过这种方式,不仅能加深对字符串处理的理解,还能锻炼我们将复杂逻辑模块化、分步骤处理的能力,从而编写出更具可读性和维护性的代码。