【问题标题】:Math behind obtaining a charaters Ascii code获取字符 Ascii 代码背后的数学
【发布时间】:2019-04-14 13:38:38
【问题描述】:

所以,基本上我在做一些 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());

【问题讨论】:

  • 除非您发布代码应该做什么,否则我无法确切知道发生了什么......这是 CoderByte 的问题之一还是……
  • 向我们展示您为尝试理解代码和编辑您的问题所做的工作,以使其针对您的问题。家庭作业问题对于 Stack Overflow 来说是可以的,但你需要做一些工作。见How do I ask and answer homework questions

标签: javascript


【解决方案1】:

事实:'a' 的 charCode 是 97,并且 (97 - 18) % 26 == 1

以'b'为例,(98 - 18) % 26 == 2,修改后charCode等于97 + 2 == 99,变为'c'。此规则适用于所有“a-z”。

现在你应该看到模式了。

测验:如果你想改变大写字母,你会选择什么作为这个案例的“幻数”?

【讨论】:

    【解决方案2】:

    关于 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”这一事实是必要的,因为我们只有从“a”到“z”的 26 个字符需要“环绕”(模数/@ 987654331@)

    请注意:

    (97('a')-18)%26 = 1
    (98('b')-18)%26 = 2
    ...
    (122('z')-18)%26 = 0
    

    因此,当您将 97 ('a') 添加到每个数字时,您会得到 'a'->'b'、'b'->'c'、...、'z'- 的函数映射>'a'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多