java - Java中的字母数字凯撒密码
问题描述
我正在尝试用 Java 解决 Caesar's Cipher,但它有一个转折点。输入字符串具有字母数字值,我无法解决。这是我到目前为止所尝试的:
String rotationalCipher(String input, int rotationFactor) {
// Write your code here
StringBuilder sb = new StringBuilder();
for(int i = 0; i < input.length(); i++) {
if(Character.isLowerCase(input.charAt(i))) {
char ch = (char)(((int)input.charAt(i) + rotationFactor - 97) % 26 + 97);
} else if (Character.isUpperCase(input.charAt(i))) {
char ch = (char)(((int)input.charAt(i) + rotationFactor - 65) % 26 + 65);
sb.append(ch);
} else {
char ch = (char)(((int)input.charAt(i) + rotationFactor - 48) % 10 + 48);
sb.append(ch);
}
}
return sb.toString();
}
我想要做的是使用它的 ASCII 值评估每个案例,但我似乎没有得到想要的输出。我使用 ASCII 错误吗?谢谢你的帮助!
Sample input/output:
input = Zebra-493?
rotationFactor = 3
output = Cheud-726?
解决方案
你有两个主要问题。
- 您没有
StringBuilder
使用append
小写转换进行更新。 - 您需要
isDigit
像大写和小写一样专门处理数字,以便您可以忽略 - 和?
几个建议。
- 只需在您第一次进入循环时分配
ch
,然后在整个循环中使用它。无需继续输入所有输入内容。 - 退出块时,仅
ch
在接近尾声时附加到 StringBuilder 一次。if/else
- 而不是像 97 和 65 这样的数字使用“a”和“A”。那样犯错误的可能性较小。
进行这些更改后,您的代码就可以正常工作。
推荐阅读
- python - 如何优化 Django 模板中的循环?
- bazel - 如何从 genrule 的输出目录生成 cc_library?
- sql - 我想使用 CONCAT 并排除和复制任何重复的条目
- jupyter - JupyterHub 上用户特定的默认生成器 URL
- php - Laravel Dusk - 如何同时运行 10 个测试(端口 9515 问题)
- excel - VBA代码添加前10个偶数,而不管一列中的输入数量如何
- javascript - 从引导网格列到轮播
- javascript - 如何根据对象中的属性对对象数组进行分组
- android - Microsoft App Center 上 Android 应用的应用内更新
- azure-pipelines - Azure Pipeline:将变量从构建传递到发布管道