【问题标题】:Changing Letters Algorithm, works in JSBIN but not in Coderbyte, seeking clarification更改字母算法,适用于 JSBIN 但不适用于 Coderbyte,寻求澄清
【发布时间】:2025-12-22 15:00:15
【问题描述】:

我在进行 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('');
}

【问题讨论】:

  • 似乎他们的后端 JS 运行器被窃听了,或者是控制台中的错误,尽管它看起来无关。
  • 谢谢,我很感激。在技​​术面试中伸展我的 JS 肌肉,这让我感到压力过大。

标签: javascript regex string-matching jsbin


【解决方案1】:

@Fabrício Matté 回答的另一个解决方案 有点解释是,使用正则表达式使用/[a-z]/从a到z获取第一个字母并通过使用String.fromCharCode(Estr.charCodeAt(0)+1)向每个字符串的ASCII添加一个来替换它们,剩下的就是找到元音再次使用正则表达式[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();
    })   
}

【讨论】:

    【解决方案2】:

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

    这是specifying a function as second parameter.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();
      });
    }
    

    【讨论】:

    • +1 我喜欢你的回答,这是一个绝妙的回答。我必须说,因为你的回答,我不得不放弃我的正则表达式技能(仍然需要了解更多关于它们的知识)。但看看我的解决方案。没有得到这部分 c.toUpperCase() === 'Z' ? 'A':
    • @Danish 是“z 变成了”部分。 toUpperCase 以不区分大小写的方式应用(z -> A,Z -> A)。 “A”字符始终为大写,因为算法最后将所有元音大写。
    • 感谢您的回答。由于算法最后总是将元音大写,并且程序已经使用String.fromCharCode(c.charCodeAt(0) + 1) 将单词替换为下一个单词,所以我想知道我们真的需要“z 成为 a”部分。干杯
    • @Danish 问题中要求“z 成为”部分。请注意,“z”的 charCode 是 122,下一个 charCode 是 123,对应于“{”字符。同样,“Z”之后的下一个字符是“[”(使用 charCode + 1 逻辑)。这就是我明确编码“z 成为”部分的原因。
    • @FabrícioMatté 谢谢你的解释。现在一切都清楚了 :) 这就是我为你 +1 的原因!
    【解决方案3】:

    与以下替代方案相比,您的代码在 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. 
    

    【讨论】: