【问题标题】:How to make element in Array change its' place如何使数组中的元素改变它的位置
【发布时间】:2018-09-02 16:23:59
【问题描述】:

我是 JS 的初学者。我试图理解 Caesar Cipher ROT13,但这对我来说太复杂了。所以我尝试编写自己的代码。如下:

function encrip() {
  var alphabet = ["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 str = "Ni Hao"; 
  var string = str.toUpperCase();
    for (var i = 0; i < string.length; i++) {
        for (var k = 0; k < alphabet.length; k++) {
            if(string.charAt(i) == alphabet[k]) {
         /* console.log(string.charAt(i) + ' ' + alphabet.indexOf(alphabet[k])); */
        }
        }
    }
}
encrip();

但我被困住了。怎么做:

1. 从 var str 中获取值,然后访问 var alphabet ,将每个字母从 var str 值更改为字母表中的下一个 3(var str 每个元素的当前位置会改变)例如:Input: Ni Hao ==&gt; output: QL KDR

2. 创建通用代码,我的意思是,不仅用于将位置更改 3,而且当我给出值“5”时,每个元素将更改字母表中的下 5 个位置。所以当我改变它的值时可以改变输出

我希望我清楚地解释了一切。提前感谢大家的帮助!!

【问题讨论】:

  • 您缺少数组开头的[
  • 没注意到。我的错。但这并不能解决问题

标签: javascript arrays caesar-cipher


【解决方案1】:

你可以使用下面的函数来加密英文单词,第一个参数是要加密的字符串,第二个参数是移位

function encryp(str,pos){
   var alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   var strUC=str.toUpperCase();
   var enc="";
    for(var i=0;i<strUC.length;i++){
    if(strUC.charAt(i)!=" "){
    enc+=alpha.charAt((alpha.indexOf(strUC.charAt(i))+pos)%26)
     }
  else{
   enc+=" "
     }
   // in your case pos=3
    }
    
    return enc;
    }
console.log(encryp("NiHao",3));

【讨论】:

    【解决方案2】:
    • 您不需要两个 for 循环来执行此操作。遍历输入string 并找到alphabet 数组中每个字符的索引,如果找到,则将shift 添加到其中以获取加密字符。

    • 要处理溢出,请使用模运算符循环遍历数组。 另外我假设您不会使用任何特殊符号来进行加密。

    function encrip(string, shift) {
      var alphabet = ["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"];
      string = string.toUpperCase();
      let arr = [];
        for (var i = 0; i < string.length; i++) {
           let char = alphabet.indexOf(string[i]) !== -1 ? alphabet[(alphabet.indexOf(string[i]) %26) + shift] : " ";
           arr.push(char);
        }
      let encryp = arr.join("");
      console.log(encryp);
      return encryp;
    }
    encrip("Ni Hao", 3);

    【讨论】:

      【解决方案3】:

      首先,你可以使用内置函数indexOf,而不是你的内部for循环扫描整个alphabet数组:

      alphabet.indexOf('K') // returns 10
      

      其次,您需要在单独的变量中构建加密字符串。对于每个字母,获取该字母在字母表中的索引,将密码偏移参数添加到该索引,并将字母表中的结果字母添加到新字符串中。一个重要的步骤是,当您添加到字母的索引时,您要确保生成的索引在alphabet 数组的范围内。您可以使用%(模)运算符来做到这一点,它将高值回绕到数组的开头。全文:

      function encipher(input, offset) {
          var alphabet = ["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 str = input.toUpperCase();
          var result = '';
      
          for (var i = 0; i < str.length; i++) {
              letterIndex = alphabet.indexOf(str.charAt(i));
              if (letterIndex === -1) {
                  result += str[i]; // if the letter isn't found in the alphabet, add it to the result unchanged
                  continue;
              }
      
              cipheredIndex = (letterIndex + offset) % alphabet.length; // wrap index to length of alphabet
              result += alphabet[cipheredIndex];
          }
      
          console.log(result);
      }
      
      encipher('Ni Hao', 5); // output: 'SN MFT'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-21
        • 2018-10-22
        • 2012-09-03
        • 2014-11-17
        相关资源
        最近更新 更多