我需要代码方面的帮助。我正在尝试解决凯撒密码问题,从我所做的阅读中,我觉得我在某种程度上走在正确的轨道上。我是编码新手,所以我还有很多东西要学,以防这看起来写得不好。我试图做的是将字符串拆分为一个数组,并检查该数组的每个元素是否都是一个字母。如果是,那么该字母将使用 charCodeAt() 和 fromCharcode() 函数转换为一个新字母。我设法只用一个字母单独执行此操作,但是当它进入循环时会搞砸它。如果有人能给我一个提示,说明我做错了什么,或者即使我正朝着正确的方向前进,我将不胜感激。谢谢!
function rot13(str) {
var splitArr = str.split('');
var newArr = [ ];
for (var i = 0; i < str.length; i++){
if (isLetter(splitArr[i]) === true){
newArr = String.fromCharCode(splitArr.charCodeAt(splitArr.length[i]) + 13);
} else {
newArr.push(splitArr[i]);
}
}
return newArr.join("");
}
function isLetter(str) {
return str.length === 1 && str.match(/[A-z]/i); //checks if its a letter
}
// Change the inputs below to test
rot13("AB? ...");
你有正确的想法,但你对细节很模糊。
首先,charCodeAt
处理字符串,而不是数组,因此您不必先将字符串拆分为数组。如方法名称所示,您要求在字符串中的给定位置输入字符代码。
其次,splitArr.length[i]
没有意义 - 在数组上调用.length
会返回一个数字,然后你不能转身下标;例如 ['a','b','c'].length[i]
变成了3[i]
.
第三,在进行腐烂 13 时,您必须确保将结果保持在字母表中。 A
的字符代码是 65,添加 13 会得到 78,这是N
,如愿以偿 - 很棒。但是N
也应该变回A
,将 13 加到 78 得到 91,这是一个左括号 ([
)。
加上 13,取结果模 26(即除以 26 后的余数),然后将其加回"A"的字符代码。
这是一个函数(小提琴),它将腐烂13单个字符字符串。您应该能够修改它以执行任何长度的字符串:
var Acode = "A".charCodeAt(0);
var Zcode = "Z".charCodeAt(0);
var aCode = "a".charCodeAt(0);
var zCode = "z".charCodeAt(0);
function rot13singleChar(ch) {
var code = ch.charCodeAt(0);
if (code >= Acode && code <= Zcode) {
code = (code - Acode + 13) % 26 + Acode;
} else if (code >= aCode && code <= zCode) {
code = (code - aCode + 13) % 26 + aCode;
}
return String.fromCharCode(code);
}