我遇到了Coderbyte挑战的问题
使用JavaScript语言,使用函数LetterChanges(str)传递str参数并使用以下算法对其进行修改。将字符串中的每个字母替换为字母表后面的字母(即c变为d,z变为a)。然后大写这个新字符串中的每个元音(a,e,i,o,u),最后返回这个修改后的字符串。
这是我的代码:
function LetterChanges(str) {
str = str.toLowerCase();
var al = "abcdefghijklmnopqrstuvwxyz";
var vo = "aeiou";
var newStr = "";
for (var i = 0;i < str.length;i++) {
if (al.charAt(al.indexOf(str.charAt(i))) == "z") {
newStr += "A";
}
else if (str.charAt(i) == " "){
newStr += " ";
}
else {
if (al.charAt(al.indexOf(str.charAt(i))+1) == vo.charAt(vo.indexOf(str.charAt(i)))) {
newStr += vo.charAt(vo.indexOf(str.charAt(i))+1).toUpperCase();
}
else {
newStr += al.charAt(al.indexOf(str.charAt(i))+1)
}
}
}
console.log(newStr);
}
LetterChanges("Argument goes here")
这会将以下内容返回到控制台:
bshvnfou hpft ifsf
但我需要返回的是:
bshvnfOU hpft Ifsf
我无法弄清楚为什么.toUpperCase()
无效。非常感谢您提供的任何帮助!
答案 0 :(得分:1)
您的问题不是toUpperCase()
不起作用,而是您的代码永远不会到达那一点。
你的
if (al.charAt(al.indexOf(str.charAt(i))+1) == vo.charAt(vo.indexOf(str.charAt(i))))
+1
,永远不会过去。那里没有必要,如果你删除它,将出现大写元音。除此之外,你的代码还有其他问题,但我会让你解决它们作为挑战的一部分: - )
答案 1 :(得分:1)
function convertText (str) {
const al = 'abcdefghijklmnopqrstuvwxyz';
return str.toLowerCase().split('').map(letter => {
if (letter.match(/\W/)) return letter;
const index = al.indexOf(letter),
newLetter = (al[index + 1] || al[0]);
return newLetter.match(/[aeiou]/) ? newLetter.toUpperCase() : newLetter;
}).join('');
}
使用字符代码:
function letterChanges (str) {
const v = {d: 69, h: 73, n: 79, t: 85, z: 65};
return str.toLowerCase().split('').map(l =>
(l.match(/\W/) ? l : String.fromCharCode(v[l] || l.charCodeAt(0) + 1))
).join('');
}
可能有更好的方法,但仍然是一个有趣的问题!再次感谢您的帮助@MattDiamant
答案 2 :(得分:0)
这是我的解决方案。它确实不满足 z成为 的要求,但是它通过了Coderbyte的测试,如下面的屏幕截图所示。
function LetterChanges(str) {
return str
.replace(/[a-z]/gi, c => String.fromCharCode(c.charCodeAt(0) + 1))
.replace(/[aeiou]/gi, c => c.toUpperCase());
}
// keep this function call here
LetterChanges(readline());