You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用数组与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

关键修正说明

  1. 替换方式优化:用直接数组索引赋值letter[i] = ...替代splice,单个元素替换时这种方式更简洁高效,也避免了参数错误。
  2. 终止内层循环:每次找到匹配字符后用break终止内层循环,防止已替换的字符被再次处理,确保转换结果正确。
  3. 非字母字符兼容:原字符串中的空格、符号等非字母字符会自动保留,因为它们不会匹配cipher中的任何元素,不会进入替换逻辑。

内容的提问来源于stack exchange,提问作者Meigu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:22:41