JavaScript字符串解码函数重构:修复测试用例输出错误
编码规则说明
- 编码示例:
ABC→ 输出:ZBYX - 规则细节:
- 英文字母表中奇数位的字母,替换为其逆序字母(例如A是第1位,逆序为Z;C是第3位,逆序为X)
- 英文字母表中偶数位的字母,替换为「自身+逆序字母」的组合(例如B是第2位,替换为BY)
需求与问题
需要实现上述编码的逆向解码逻辑,将编码后的字符串还原为原始输入。现有JavaScript解码函数存在错误,部分测试用例结果不符合预期:
- 输入
JQPLO时,函数输出QJKL,预期输出JKL - 输入
NMLPK时,函数输出MNOP,预期输出NOP
重构后的解码函数
const alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const reverseAlpha = alpha.split('').reverse().join(''); // 预生成逆序字母表,减少重复计算 function decode(str) { let result = ""; let i = 0; const strLen = str.length; while (i < strLen) { const currentChar = str[i]; const charPosition = alpha.indexOf(currentChar) + 1; // 字母在原表中的位置(从1开始) const isEvenChar = charPosition % 2 === 0; if (isEvenChar) { // 检查下一个字符是否是奇数位(原始偶数位编码的后缀) if (i + 1 < strLen && (alpha.indexOf(str[i+1]) + 1) % 2 !== 0) { // 当前是原始偶数位编码的前缀(自身),直接保留 result += currentChar; i += 2; // 跳过后缀的逆序字符 } else { // 当前是原始奇数位的编码(逆序字母),转成原始字符 result += reverseAlpha[alpha.indexOf(currentChar)]; i += 1; } } else { // 奇数位字符只能是原始偶数位编码的后缀,直接跳过 i += 1; } } return result; }
代码说明
- 预生成
reverseAlpha逆序字母表,避免重复计算逆序字符,提升执行效率 - 用
while循环替代for循环,灵活控制索引步进(编码后的字符可能占1位或2位) - 核心逻辑:
- 编码后的偶数位字母分两种情况处理:
- 若后续紧跟奇数位字母:属于原始偶数位字符的编码(自身+逆序),直接保留当前字符,索引+2跳过后缀
- 若单独出现:属于原始奇数位字符的编码(逆序字母),转成原始字符后索引+1
- 编码后的奇数位字母仅作为原始偶数位编码的后缀,直接跳过
- 编码后的偶数位字母分两种情况处理:
测试验证:
- 输入
JQPLO→ 输出JKL(符合预期) - 输入
NMLPK→ 输出NOP(符合预期)
内容的提问来源于stack exchange,提问作者jumosbro
相关产品推荐
相关产品推荐

