「JavaScript」简单密码「字符串模拟」🔑
简单密码
https://www.nowcoder.com/practice/7960b5038a2142a18e27e4c733855dac
算法思路
该题目要求我们将一个密码字符串转换为另一种形式,转换规则如下:
- 小写字母:将小写字母转换成九键手机键盘对应的数字。具体的映射关系如下:
a,b,c→ 2d,e,f→ 3g,h,i→ 4j,k,l→ 5m,n,o→ 6p,q,r,s→ 7t,u,v→ 8w,x,y,z→ 9
- 大写字母:将大写字母转为小写字母后,再将其字符往后移一位。例如,
A转为b,Y转为z,而Z转为a。 - 其他字符:数字和其他符号不做任何变换。
实现思路是:先遍历并替换小写字母,再处理大写字母的转换,最终生成新的字符串。
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)。