1

我正在通过 CoderByte 练习,我遇到了以下问题:

>使用 JavaScript 语言,让函数 LetterChanges(str) 获取传递的 str 参数并使用以下算法对其进行修改。将字符串中的每个字母替换为字母表中紧随其后的字母(即,c 变为 d,z 变为 a)。然后将这个新字符串中的每个元音(a、e、i、o、u)大写,最后返回这个修改后的字符串。

我在 JSBin 中写了出来,它运行良好(即使是 te,但在 CoderByte 中却没有。我想问社区我写的内容是否正确,这是 CoderByte 的问题,或者我的代码是否错误并且问题在于 JSBin。

代码如下:

function LetterChanges(str) {
    var iLetters = str.split('');
    var newStr = [];

    for (var i = 0; i < str.length; i++) {
        if (/[a-y]/ig.test(iLetters[i])) {
            newStr[i] = String.fromCharCode(iLetters[i].charCodeAt(0) + 1);
            if (/[aeiou]/ig.test(newStr[i])) {
                newStr[i] = newStr[i].toUpperCase();
            }
        } else if (/[z]/ig.test(iLetters[i])) {
            newStr[i] = "A";
        } else if (/[^A-Z]/ig.test(iLetters[i])) {
            newStr[i] = iLetters[i];
        }
    }

    return newStr.join('');
}
4

3 回答 3

1

似乎确实是他们后端 JS 运行器上的一个错误。正如您所说,您的代码运行良好,应该被接受。值得向他们的支持 imo 报告。

这是一个替代解决方案,将函数指定为第二个参数.replace()

function LetterChanges(str) {
  return str.replace(/[a-z]/ig, function(c) {
    return c.toUpperCase() === 'Z' ? 'A' : String.fromCharCode(c.charCodeAt(0) + 1);
  }).replace(/[aeiou]/g, function(c) {
    return c.toUpperCase();
  });
}
于 2013-08-03T19:46:26.137 回答
0

与以下替代方案相比,您的代码在jsfiddle上对我来说工作得很好

在 CoderByte 上,您的代码失败了,但以下代码有效。似乎是他们网站上的问题。

function letterChanges(str) {
    var newString = "",
        code,
        length,
        index;

    for (index = 0, length = str.length; index < length; index += 1) {
        code = str.charCodeAt(index);
        switch (code) {
            case 90:
                code = 65;
                break;
            case 122:
                code = 97
                break;
            default:
                if ((code >= 65 && code < 90) || (code >= 97 && code < 122)) {
                    code += 1;
                }
        }

        newString += String.fromCharCode(code);
    }

    return newString.replace(/[aeiou]/g, function (character) {
        return character.toUpperCase();
    });
}

console.log(LetterChanges("Then capitalize every vowel in this new string (a, e, i, o, u) and finally return this modified string."));
console.log(letterChanges("Then capitalize every vowel in this new string (a, e, i, o, u) and finally return this modified string."));

输出

UIfO dbqjUbmjAf fwfsz wpxfm jO UIjt Ofx tUsjOh (b, f, j, p, v) bOE gjObmmz sfUvsO UIjt npEjgjfE tUsjOh. fiddle.jshell.net/:70
UIfO dbqjUbmjAf fwfsz wpxfm jO UIjt Ofx tUsjOh (b, f, j, p, v) bOE gjObmmz sfUvsO UIjt npEjgjfE tUsjOh. 
于 2013-08-03T19:51:48.770 回答
0

@Fabrício Matté 回答的另一个解决方案和一点解释是,使用正则表达式从 a 到 z 获取第一个字母,/[a-z]/并通过在每个字符串的 ASCII 中添加一个来替换它们,String.fromCharCode(Estr.charCodeAt(0)+1)剩下的就是找到元音再次使用正则表达式[aeiou]并返回它的大写字符串。

function LetterChanges(str) { 
    return str.replace(/[a-z]/ig, function(Estr) {
        return String.fromCharCode(Estr.charCodeAt(0)+1);
    }).replace(/[aeiou]/ig, function(readyStr) {
        return readyStr.toUpperCase();
    })   
}
于 2016-02-08T08:54:46.610 回答