【问题标题】:Cesar's Cypher method repeating the last letter of each wordCesar 的 Cypher 方法重复每个单词的最后一个字母
【发布时间】:2017-08-08 19:30:05
【问题描述】:

我正在制作将字母移动 13 位的 Cesar's Cypher。它有效,但每个单词的最后一个字母重复。我知道可能有一种更有效的方法来编写它,但这是我的代码。

function rot13(str) {
  var letters = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
  var word = "";
  var z = 30;
  for (i = 0; i < str.length; i++) {
    if (str.substring(i, i + 1) === " ") {
      word = word + str.substring(i, i + 1);
    }

    for (x = 0; x < letters.length; x++) {
      if (str.substring(i, i + 1) === letters[x]) {
        z = x; //18
      }
    }

    var n = z + 13; //31
    if (n >= 26) {
      word = word + letters[13 - (26 - z)];
    } else if (n < 26)
      word = word + letters[13 + z];
  }

  return word;
}


rot13("LBH QVQ VG!");

例如 LBH QVQ VG!打印出 YOU UDID DITT 而不是 YOU DID IT!。另外,我是 javascript 新手,所以如果有任何语法看起来不对,请纠正我。

【问题讨论】:

  • 使用{ a: "m", b: "n" ... } 形式的查找表在这里您可能会更轻松,您可以使用函数将每个字母直接替换为replace。跨度>
  • @MaciejKwas 这并不能解释他在这里做错了什么。
  • 如果你真的想学习编程,这似乎是一个学习如何使用调试器的好机会。

标签: javascript


【解决方案1】:

问题在于,当您找到一个空格并将其复制到结果中时,您不会跳过处理该字符的其余代码。由于设置z 的循环永远找不到匹配项,它使用循环的上一次迭代中z 的值,因此它复制了前一个单词的最后一个字符。

如果有标点符号,也会发生同样的事情。在这种情况下,测试空格的代码不会将其复制到结果中,然后您进入在letters 中查找字符的循环,它没有找到它,所以它再次使用之前的值z.

两者的简单解决方案是检查当前字符是否在letters 中,而不是专门检查space

顺便说一句,您可以使用str[i]str.charAt(i) 来获取字符串中的当前字符,而不是str.substring(i, i+1)。要查找数组的元素,请使用letters.indexOf(char) 而不是显式循环。

function rot13(str) {
  var letters = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
  var word = "";
  var z = 30;
  for (i = 0; i < str.length; i++) {
    var char = str[i];
    z = letters.indexOf(char);
    if (z == -1) {
      word += char;
      continue;
    }

    var n = z + 13; //31
    if (n >= 26) {
      word = word + letters[13 - (26 - z)];
    } else if (n < 26)
      word = word + letters[13 + z];
  }

  return word;
}


console.log(rot13("LBH QVQ VG!"));

您可以使用模运算符,而不是最后的 if 语句:

word += letters[n % letters.length];

【讨论】:

    【解决方案2】:

    您的第一个问题是,如果您检测到空格,您应该continue; for 循环(否则您最后使用的字符会被第二次附加):

    if (str.substring(i, i + 1) === " ") {
      word += " ";
      continue;
    }
    

    您的第二个问题是您不在乎是否在您的 letters 数组中找不到当前字符,在这种情况下,您的代码只需使用最后一个 z

    顺便说一句:在你的位置上,我会看看 JS 的内置函数,例如splitindexOfcharCodeAtfromCharCode,它们可以大大简化你的生活.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      相关资源
      最近更新 更多