0

我正在尝试分析/逆向工程某人的 Coderbyte 代码。这个挑战的目的是获取一个字符串参数,并用字母表中跟随它的字母替换字符串的每个字母(a 变为 b,z 变为, ETC)。然后我们将新字符串中的每个元音大写(a,e,i,o,u)。找到某人的代码后,我很惊讶他/她如何简化它,但我有两个具体问题:

1)代码的哪一部分(见下文)大写???我没有看到它,所以我一定想念它???(注意这可能会是完全显而易见的)

2) else 语句什么时候开始起作用?if-else 是 if (n>-1),那么 n <= -1 什么时候?在代码中,n 始终是给定字符串参数的特定字母的索引——它是 oldAlph 中的索引。该索引将由 0 - 25 组成。所以我不明白它什么时候是 -1 或 -2 等等......

这是代码:

function LetterChanges(str) { 

  // code goes here
  var n = 0;
  var nstr = "";
  var oldAlph = ["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 newAlph = ["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","A"];
  for (i=0;i<str.length;i++) {
    n = oldAlph.indexOf(str.substr(i,1));
    if (n>-1) {
      nstr = nstr + newAlph[n];
    } else {
      nstr = nstr + str.substr(i,1);
    }
  }
   return nstr; 

}

// keep this function call here 
// to see how to enter arguments in JavaScript scroll down
LetterChanges(readline());
4

4 回答 4

1

由于您已经有了问题的答案,这里有一种解决正则表达式和字符代码问题的方法:

function transform(str) {
  return str.replace(/[a-z]/gi, function(l) {
    var next = String.fromCharCode(l.charCodeAt(0) + 1);
    if (/[aeiou]/.test(next)) next = next.toUpperCase();
    return l == 'Z' ? 'A' : l == 'z' ? 'a' : next;
  });
}

transform('hello world'); //=> "Ifmmp xpsmE"
于 2013-12-01T04:12:23.160 回答
1

1:您正在获取字符的大写版本并将其附加到此处的新字符串中:nstr = nstr + newAlph[n];

2:如果在 oldAlph 数组中没有找到当前字符,它将是 === -1,例如。点或逗号或感叹号..等。在这种情况下,您不需要对字符执行任何转换,因为它不是字母表的一部分。

于 2013-12-01T04:06:42.167 回答
0

newAlph 数组已经具有大写元音。

如果当前字符是字母,则第一个 if 语句会将 newAlph 中的字母添加到 nstr 变量中。

于 2013-12-01T04:09:48.387 回答
-1

正如@bagonyi 所说,该语句适用于在数组else中找不到字符串参数中的字符时。oldAlph在这种情况下,这不会为 n 产生负数(正如您在问题中推测的那样),而是 yield undefined

此外,您发布的代码并不能解决所有可能的字符串,尤其是那些已经包含大写字母的字符串。因此,在 Coderbyte 中,当您在 Parameter Testing 字段中使用原始测试字符串“Argument goes here”运行此代码时,输​​出为“AshvnfOU hpft Ifsf”;请注意,“A”没有改变,因为它不存在于oldAlph.

于 2015-09-09T20:42:19.233 回答