Java实现字符串大小写互换及N位循环字符偏移问题求助
Java字符串大小写互换+循环偏移实现方案
现有代码问题梳理
- 语法错误:内层for循环的初始化部分错误使用逗号代替分号,Java中for循环的三个控制表达式必须用分号分隔
- 语法错误:直接使用
sb[i]访问StringBuilder字符属于非法写法,必须调用charAt()方法读取字符,setCharAt()方法修改字符 - 逻辑错误:
if (sb[i] == ALPHABET[j] && sb[i] == ALPHABET[j].toUpperCase())条件永远不成立,单个字符不可能同时等于同一个字母的大小写形式 - 功能缺失:未实现循环偏移逻辑,直接用
j+distance访问字母表会在偏移量超出长度时抛出数组下标越界异常,也没有处理负数偏移量的场景 - 性能问题:两层循环遍历字母表的方式效率极低,无需额外遍历,可通过ASCII码计算直接得到偏移结果
实现思路
两个需求可以合并在一次遍历中完成,减少不必要的遍历开销:
- 对每个字符先完成大小写互换,非字母字符直接保留无需后续处理
- 对互换后的字母字符,基于ASCII码计算其在对应大小写字母表中的位置
- 位置加上偏移量后对26取模,取模前额外加26避免负数偏移量得到负下标,实现循环逻辑
- 根据字母的大小写,将计算得到的新位置转换为对应字符即可
修正后代码
private static final int ALPHABET_LENGTH = 26; public String code(String text, int distance) { StringBuilder sb = new StringBuilder(text.length()); for (char originalChar : text.toCharArray()) { // 大小写互换 char switchedCaseChar; if (Character.isLowerCase(originalChar)) { switchedCaseChar = Character.toUpperCase(originalChar); } else if (Character.isUpperCase(originalChar)) { switchedCaseChar = Character.toLowerCase(originalChar); } else { // 非字母直接保留,不做偏移 sb.append(originalChar); continue; } // 计算循环偏移后的字符 boolean isCurrentLower = Character.isLowerCase(switchedCaseChar); // 取当前字符所属大小写的基准ASCII值 char baseAscii = isCurrentLower ? 'a' : 'A'; // 计算字符在字母表中的位置(0~25) int originPosition = switchedCaseChar - baseAscii; // 计算偏移后的位置,加ALPHABET_LENGTH避免负数偏移得到负下标 int newPosition = (originPosition + distance % ALPHABET_LENGTH + ALPHABET_LENGTH) % ALPHABET_LENGTH; char resultChar = (char) (baseAscii + newPosition); sb.append(resultChar); } return sb.toString(); }
效果验证示例
输入字符串aBc!9,偏移量3:
- 大小写互换后得到
AbC!9 - 偏移计算:
- 'A'偏移3位得'D'
- 'b'偏移3位得'e'
- 'C'偏移3位得'F'
- 非字母字符
!和9直接保留
最终输出结果为DeF!9
内容的提问来源于stack exchange,提问作者icatalan
相关产品推荐
相关产品推荐

