Java实现凯撒密码ASCII字符偏移仅单测试用例通过问题排查
凯撒密码代码逻辑问题说明
你的代码恰好能通过给出的测试用例属于巧合,存在3个核心逻辑缺陷:
- 未区分大小写字母的溢出判定:大写字母ASCII范围为65(A)~90(Z),你仅处理了小写字母溢出(ASCII>122)的场景,大写字母偏移后超过90时没有回绕逻辑,比如输入
Z偏移2,你的代码会输出ASCII为92的\,而非预期的B。 - 未对偏移量k取模26:凯撒密码偏移量超过26时等价于偏移
k%26,当k大于26时,你直接用原值相加后仅减一次26根本无法完成正确回绕,会得到完全错误的字符。 - 溢出回绕逻辑不严谨:仅对溢出值减26的处理只在溢出长度不超过26时生效,更稳妥的实现是先将字符转换为对应大小写字母表的0~25相对位置,偏移后取模26再转回ASCII,从根源避免溢出问题。
修正后代码
public static String caesarCipher(String s, int k) { // 先对偏移量取模26,避免k过大的问题 k = k % 26; StringBuilder newString = new StringBuilder(); for (int i = 0; i < s.length(); i++) { char currentChar = s.charAt(i); if (Character.isUpperCase(currentChar)) { // 处理大写字母:先转到0-25区间,偏移取模后转回ASCII int originalPos = currentChar - 'A'; int newPos = (originalPos + k) % 26; newString.append((char) ('A' + newPos)); } else if (Character.isLowerCase(currentChar)) { // 处理小写字母 int originalPos = currentChar - 'a'; int newPos = (originalPos + k) % 26; newString.append((char) ('a' + newPos)); } else { // 非字母字符直接保留 newString.append(currentChar); } } return newString.toString(); }
内容的提问来源于stack exchange,提问作者user16225412
相关产品推荐
相关产品推荐

