使用数组与for..loop实现rot13凯撒密码遇问题,求代码排查
凯撒密码(Rot13)代码错误排查与修复
问题分析
你的代码存在两个核心错误:
- splice方法参数误用:
splice的第一个参数需要传入数组索引,而你传的是数组元素值(比如letter[i]),这会导致无法正确定位到要替换的元素位置。 - 重复替换问题:找到匹配字符替换后,内层循环没有终止,会继续遍历
cipher数组,导致已经替换后的字符被再次匹配并反向替换,最终结果错误。
修正后的代码
function rot13(str) { let letter = str.split("") let cipher = [ ["A", "N"], ["B", "O"], ["C", "P"], ["D", "Q"], ["E", "R"], ["F", "S"], ["G", "T"], ["H", "U"], ["I", "V"], ["J", "W"], ["K", "X"], ["L", "Y"], ["M", "Z"] ] for (let i = 0; i < letter.length; i++) { for (let j = 0; j < cipher.length; j++) { if (letter[i] === cipher[j][0]) { letter[i] = cipher[j][1]; // 直接通过索引赋值替换,无需splice break; // 找到匹配后立即退出内层循环,避免重复处理 } else if (letter[i] === cipher[j][1]) { letter[i] = cipher[j][0]; break; } } // 非字母字符(如空格)不在cipher中,会保持原样 } return letter.join("") } console.log(rot13("SERR PBQR PNZC")); // 输出: FREE CODE CAMP
关键修正说明
- 替换方式优化:用直接数组索引赋值
letter[i] = ...替代splice,单个元素替换时这种方式更简洁高效,也避免了参数错误。 - 终止内层循环:每次找到匹配字符后用
break终止内层循环,防止已替换的字符被再次处理,确保转换结果正确。 - 非字母字符兼容:原字符串中的空格、符号等非字母字符会自动保留,因为它们不会匹配
cipher中的任何元素,不会进入替换逻辑。
内容的提问来源于stack exchange,提问作者Meigu
相关产品推荐
相关产品推荐

