反转字符串中奇数长度单词遇异常,求代码排查及解决方案
问题排查与解决方案
错误原因分析
你的代码存在两个核心问题:
- 全局StringBuilder导致整体反转混乱:你使用了静态全局的
sb,每次调用reverse()时会反转整个sb中已拼接的所有内容,而非仅反转当前处理的单词。比如处理完"One"反转后得到"enO ",接着处理"Two"时append后变成"enO Two ",再反转就变成了" owT enO ",后续操作会持续打乱整体顺序,同时导致"Two"的反转效果被错误覆盖。 - 单词反转逻辑错误:"Two"长度为3(奇数)本应被反转,但由于全局
sb的反转操作影响了整体顺序,导致它的反转效果被叠加抵消,最终表现为未反转。
修正后的代码
package QAIntvSprint; import java.util.Arrays; public class SecretAgent { public static void main(String[] args) { secretAgentII("One Two three Four"); } static void secretAgentII(String s) { String[] arr = s.split(" "); // 使用局部StringBuilder,避免全局累积和整体反转问题 StringBuilder resultSb = new StringBuilder(); for (String word : arr) { if (word.length() % 2 == 0) { resultSb.append(word).append(" "); } else { // 为每个奇数长度的单词单独创建StringBuilder进行反转 StringBuilder wordSb = new StringBuilder(word); resultSb.append(wordSb.reverse()).append(" "); } } // 去除末尾多余的空格后输出 System.out.println(resultSb.toString().trim()); } }
修正说明
- 改用局部StringBuilder:将结果容器改为方法内的局部变量,彻底避免全局状态带来的累积和意外反转问题。
- 单独反转目标单词:对每个奇数长度的单词,新建独立的StringBuilder来反转该单词,再将反转结果拼接到结果容器中,确保仅反转当前单词,不影响已拼接的内容。
- 清理末尾空格:用
trim()方法移除最后一个单词后多余的空格,输出更整洁的结果。
运行修正后的代码,将得到预期输出:enO owT eerht Four
内容的提问来源于stack exchange,提问作者Neel Chavan
相关产品推荐
相关产品推荐

