一段由凯撒密码加密过的密文,凯撒密码指的是将字符偏移一定的单位,例如若偏移量为2,则a替换为c,b替换为d,c替换为e,...,z替换为b。若加密nowcoder,则密文为pqyeqfgt。现在发现加密包括数字、大写字母、小写字母,即0-9、A-Z、a-z的排列顺序进行偏移,现在截获了对方的一段密文以及偏移量,给定一段密文str和偏移量d,求对应的明文。
输入:
"pqyeqfgt",2
返回值:
"nowcoder"
复制
输入:
"123ABCabc",3
返回值:
"yz0789XYZ"
1≤∣str∣≤1000,1≤d≤61,d为加密时的偏移量
为了解密凯撒密码,我们可以遍历密文中的每个字符,并根据偏移量d进行逆向偏移。考虑到字符包括数字、大写字母和小写字母,我们需要分别处理这三种情况。以下是一个基于Java的解决方案:
Java
import java.util.*;
public class Solution {
public String decode (String str, int d) {
StringBuilder plaintext = new StringBuilder();
for (char c : str.toCharArray()) {
if (Character.isDigit(c)) { // 数字字符
plaintext.append((char)(((c - '0' - d + 10) % 10) + '0'));
} else if (Character.isUpperCase(c)) { // 大写字母
plaintext.append((char)(((c - 'A' - d + 26) % 26) + 'A'));
} else if (Character.isLowerCase(c)) { // 小写字母
plaintext.append((char)(((c - 'a' - d + 26) % 26) + 'a'));
} else { // 非数字和字母字符,直接保留原样
plaintext.append(c);
}
}
return plaintext.toString();
}
}
在这段代码中,我们首先创建了一个StringBuilder对象用于存储解密后的明文。然后遍历输入字符串str
中的每个字符,判断其类型并执行相应的逆向偏移操作:对于数字字符(0-9),在ASCII码表上做逆向偏移;对于大写字母(A-Z)和小写字母(a-z),同样在各自的范围内进行逆向偏移。最后返回构建好的明文字符串。注意,这里我们对偏移结果取模以确保字符始终在有效范围内。非数字和字母字符则不做任何改变,直接添加到明文中。