|
发表于 2024-7-3 18:10:02
|
显示全部楼层
本帖最后由 jackz007 于 2024-7-4 10:09 编辑
1、ord('a') = 97,ord('z') = 122,所以,'a' ~ 'z' 对应的 ASCII 编码数值的范围为 97 ~ 122,如果一个字符的编码不在此范围之内,那就可以断定,这个字符不是一个小写字母。这也是本题所谓"溢出" 的意思。
2、此题的前提条件是,字母表本身必须是一个闭环,就是说,'a' 的前一个字母是 'z' 后一个子字母是 'b',同样,'z' 的前一个字母是 'y',后一个字母是 'a'。
3、如果让 base = ord('a'),那么,任何一个小写字母都可以表达为
shift 就是目标字符对字母 'a' 在字母表中的位置偏移,比如,'a' 的 shift = ord('a') - ord('a') = 0,'c' 的 shift = ord('c') - ord('a') = 2,'z' 的 shift = ord('z') - ord('a') = 25. . . . . .。
总之,只要把 shift 的数值约束在 0 ~ 25 之内,新字符的 ASCII 编码就不会越界(溢出),为了做到这一点,目标字符的表达需要进一步调整为:
这样,当 shift 的数值超出 0 ~ 25 的时候,取余操作会确保其数值回归正常范围,从而实现字母表"自动回卷('z' 后为 'a','a' 前为 'z')"的效果。
例如,对于字符串 'b3x5' 而言,'b3' 的 shift = ord('b') - ord('a') + 3 = 4,目标字符为 chr(ord('a') + 4 % 26) = chr(97 + 4) = 'e';'x5' 的 shift = ord('x') - ord('a') + 5 = 28, 目标字符为 chr(ord('a') + 28 % 26) = chr(97 + 2) = 'c'。所以,'b3x5' 所表达的字符串应该是 'ec'。 |
|