「JavaScript」简单密码「字符串模拟」🔑

简单密码

https://www.nowcoder.com/practice/7960b5038a2142a18e27e4c733855dac

算法思路

该题目要求我们将一个密码字符串转换为另一种形式,转换规则如下:

  1. 小写字母:将小写字母转换成九键手机键盘对应的数字。具体的映射关系如下:
    • 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
  2. 大写字母:将大写字母转为小写字母后,再将其字符往后移一位。例如,A 转为 bY 转为 z,而 Z 转为 a
  3. 其他字符:数字和其他符号不做任何变换。

实现思路是:先遍历并替换小写字母,再处理大写字母的转换,最终生成新的字符串。

Code

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // 读取输入的密码
    console.log(transformPassword(await readline()));
}()

function transformPassword(str) {
    // 九键手机键盘字母到数字的映射
    let base = {2: 'abc', 3: 'def', 4: 'ghi', 5: 'jkl', 6: 'mno', 7: 'pqrs', 8: 'tuv', 9: 'wxyz'};

    // 先将小写字母替换成数字
    let str1 = str.replace(/[a-z]/g, x => {
        // 遍历 base 对象,找到当前字母对应的数字
        for (const [key, value] of Object.entries(base)) {
            if (value.includes(x)) {
                return key;  // 返回对应的数字
            }
        }
    });

    // 再将大写字母替换成往后移一位的小写字母,注意字母‘Z’需单独拎出来转变为‘a’
    let str2 = str1.replace(/[A-Z]/g, x => {
        // 处理 'Z' 特殊情况,其他大写字母转为小写并往后移一位
        return x === 'Z' ? 'a' : String.fromCharCode(x.toLowerCase().charCodeAt(0) + 1);
    });

    // 返回最终转换后的字符串
    return str2;
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是输入字符串的长度。我们只需要遍历两次字符串,分别处理小写字母和大写字母,因此总的时间复杂度为 O(n)。
  • 空间复杂度:O(n),因为我们需要存储转换后的字符串,空间复杂度为 O(n)。
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务