Coderbyte Letter更改 - 错误更改

时间:2015-09-24 11:49:47

标签: javascript regex string

我正在解决Coderbyte上的Letter Change挑战,其内容如下:

  

让函数LetterChanges(str)获取传递的str参数并使用以下算法对其进行修改。

     

将字符串中的每个字母替换为字母表后面的字母(即c变为d,z变为a)。

     

然后将这个新字符串(a,e,i,o,u)中的每个元音大写,最后返回这个修改后的字符串。

但我不知道为什么我的代码中用字母表中的下一个字母更改字母的部分无法正常工作。这是代码:

function LetterChanges(str){
    for(var i in str){
        if(str.charAt(i).match(/[a-y]/i)) 
           str = str.replace(str.charAt(i),String.fromCharCode(str.charCodeAt(i) + 1));
        else if(str.charAt(i).match(/z/i))
           str = str.replace(str.charAt(i),"a");
    }
    // the code to capitalize vowels follows
    return str;
}
  LetterChanges("Argument goes here") //outputs "Btivpfnu hofs hfsf" instead of "Bshvnfou hpft ifsf"

5 个答案:

答案 0 :(得分:0)

  

但我不知道为什么我的代码部分会改变字母   用字母表中的下一个

正则表达式解决方案:

function setNextWithVowels(str)
{  str=str.toLowerCase();
   return  str.replace(/([a-z])/g,function(m,g){ 
    var c=g.charCodeAt();
    var nxt=String.fromCharCode(c==122?c-25:c+1);
    return   /[aeiou]/g.test(nxt) ? nxt.toUpperCase():nxt;});
}

 console.log(setNextWithVowels("abz")) //bcA

为个人设置下一个字母的另一种方法:

function getNextchar(c)
{
 var a='abcdefghijklmnopqrstuvwxyz' , len = a.length;
 return  a.substr((a.indexOf(c) + 1) % len  ,1) 
}

alert(getNextchar('x')); //y
alert(getNextchar('z')); //a

答案 1 :(得分:0)

我会使用这段代码:

function LetterChanges(str){
    var output = "";
    for(var i in str){
        if(str.charAt(i) == 'z') {
            output += 'a';
        }
        else {
           output += String.valueOf((str.charAt(i) + 1));
        }
    }
    // the code to capitalize vowels follows
    return output;
}

答案 2 :(得分:0)

看起来你有点过于复杂了。

方法是:

  • 将每个字母替换为......:
    • 如果是“z”或“Z”:“a”或“A”(offset -25
    • 否则接下来的字母(offset 1
function LetterChanges(str){
  str=str.replace(/[a-z]/gi,function(letter){
    var offset=1;
    if(letter.toLowerCase()=='z'){
      offset=-25;
    }
    return String.fromCharCode(letter.charCodeAt()+offset);
  });

  // code to capitalize vowels here

  return str;
}
LetterChanges('abczABCZ'); // bcdaBCDA

答案 3 :(得分:0)

所以,我已经弄清楚为什么你的代码会导致你出现问题 - 花了一些时间来弄清楚发生了什么:)

这是你的问题:

str = str.replace(str.charAt(i), String.fromCharCode(str.charCodeAt(i) + 1));

在控制台中,如果在替换后记录str的输出,您可以看到发生了什么。

起初一切顺利:

Brgument goes herez
Bsgument goes herez
Bshument goes herez
Bshvment goes herez
Bshvnent goes herez
Bshvnfnt goes herez
Bshvofnt goes herez
Bshvofnu goes herez
Bshvofnu hoes herez
Bshvpfnu hoes herez
Bshvpfnu hofs herez

直到你到达这里。

Bthvpfnu hofs herez

当它试图改变" s时,会发生什么?在#34;结束时#34; str.charAt(i)等于" s",但替换只是做了它的意图:更改首先" s"在strt,这也是为什么它不会改变第二个" s"到了" t"。

Btivpfnu hofs herez
...

这里的每个人都为您提供了如何重新编码的答案,但这是为什么您的代码无法正常工作。希望有所帮助。

不是回答你的问题,而是解决问题的另一种方法:

function letterChanges(str) {

  // put the string into lowercase (not sure if you need to do this
  // but it makes sense if you only want the vowels in uppercase
  // and then split the string into an array and use `map` to...
  return str.toLowerCase().split('').map(function (el, i) {

    // swap the letters
    var swap = el !== 'z' ? String.fromCharCode(el.charCodeAt(0) + 1) : 'a';

    // and then return the letter, changing it to uppercase if it's
    // a vowel. Finally return the joined array
    return /[aeiou]/g.test(swap) ? swap.toUpperCase() : swap;
  }).join('');
}

letterChanges('Andz'); // bOEA

DEMO

答案 4 :(得分:0)

您没有在代码中指定match函数来进行全局搜索:

if (str.charAt(i).match(/[a-y]/g))

修正一下,正确更改每个字母的代码是正确的。

现在完成元音的大写......