因此,基本上,我正在做一些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());
答案 0 :(得分:1)
事实:“ a”的charCode为97,并且(97-18)%26 == 1
以'b'为例,例如(98 - 18) % 26 == 2
,因此在更改后,其charCode等于97 + 2 == 99
成为'c'。此规则适用于所有“ a-z”。
现在您应该看到模式了。
测验:如果要更改大写字母怎么办?在这种情况下,您会选择什么作为“魔术数字”?
答案 1 :(得分:0)
关于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”,因此我们需要“环绕”(模数/ { {1}})
请注意:
%
因此,当您向每个数字加97('a')时,您将获得'a'->'b','b'->'c',...,'z'- >'a'