我正在尝试分析/反向设计某人的Coderbyte代码。这个挑战的目的是获取一个字符串参数并用字母表中的字母后面的字母替换字符串中的每个字母(a成为b, z成为等等)。然后我们将把新字符串中的每个元音大写(a,e,i,o,u)。在找到某人的代码之后,我对他/她如何简化它感到惊讶,但我有两个具体的问题:
1)代码的哪一部分(见下文)进行大写?我没有看到它所以我一定想念它? (看它可能会变得非常明显)
和
2)其他声明何时发挥作用? 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());
答案 0 :(得分:1)
1:你抓住角色的大写版本并将其附加到新的字符串:nstr = nstr + newAlph[n];
2:如果在oldAlph数组中找不到当前字符,则为=== -1,例如。点或逗号或感叹号等。在这种情况下,您不需要对字符执行任何转换,因为它不是字母表的一部分。
答案 1 :(得分: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"
答案 2 :(得分:0)
newAlph数组已经有大写的元音。
如果当前字符是一个字母,第一个if语句会将newAlph中的字母添加到nstr变量中。