所以,基本上我正在做一些JS练习,我理解这段代码,只是无法弄清楚在String.fromCharCode函数中获取字符Ascii代码背后的数学是什么?为什么我们减少18?
使用函数LetterChanges(str)传递str参数并使用以下算法对其进行修改。将字符串中的每个字母替换为字母表后面的字母(即c变为d,z变为a)。然后大写这个新字符串(a,e,i,o,u)中的每个元音,最后返回这个修改后的字符串。
function LetterChanges(str) {
str = str.trim().toLowerCase();
var len = str.length;
var newStr = '';
for (var i = 0; i < len; i++) {
if (/[a-ce-gi-mo-su-y]/.test(str[i])) {
newStr += String.fromCharCode(((str[i].charCodeAt(0) - 18) % 26) +
97)
}
else if (/[zdhnt]/.test(str[i])) {
newStr += String.fromCharCode(((str[i].charCodeAt(0) - 18) % 26) +
65);
}
else {
newStr += str[i];
}
}
return newStr;
}
LetterChanges(readline());
关于ASCII
嗯,如您所知,计算机不会将字符存储为“a”,“b”,“z”或“。”,它们只接受二进制位(0或1)。这些二进制位可用于形成整数和数字,但不能用于形成字符串和字符。
那么计算机如何存储角色呢?这就是ASCII(美国信息交换标准代码)的用武之地。
因此,我们的想法是每个字符都需要存储为数字,然后ASCII代码就是对应于什么字符的数字的标准化,反之亦然。
所以回答你的第一个问题:String.fromCharCode(x)
只是返回标准化ASCII表中对应于数字x
的字符。例如,String.fromCharCode(65)
将返回'A
',因为'A
'的ASCII码由标准标准化为65。
为什么-18
这是一个聪明(但令人困惑)的黑客,强制所有小写字母跟随它后面的字符。
因为str
被str = str.trim().toLowerCase();
行设为小写,所以str [i]现在只包含从97('a')到97 + 25 = 122('z')的值。现在18 = 122 (mod 26)
或122%26
。
这是必要的,以适应'z'需要转到'a'的事实,因为我们只有26个字符从'a'到'z'我们需要“环绕”(模数/ %
)
注意:
(97('a')-18)%26 = 1
(98('b')-18)%26 = 2
...
(122('z')-18)%26 = 0
因此,当您为每个数字添加97('a')时,您会得到'a' - >'b','b' - >'c',...,'z' - >'a的函数映射“
事实:'a'的charCode是97,而(97 - 18)%26 == 1
以'b'为例,(98 - 18) % 26 == 2
,所以改变之后,它的charCode等于97 + 2 == 99
,变成'c'。此规则适用于所有'a-z'。
现在您应该看到模式。
测验:如果你想改变大写字母怎么办?你会选择什么作为这个案例的“神奇数字”?