Java反转字符串奇数长度单词的代码问题修复求助
修复奇数长度单词反转的Java代码
问题背景
需求:输入一个句子,仅反转其中奇数长度的单词,偶数长度单词保持原样。现有代码运行结果不符合预期:
- 输入示例:
One two three Four - 预期输出:
enO owT eerhT Four - 实际输出:
enO One owtOne two eerhtenOtwo three Four
原代码如下:
static String secretAgentII(String s) { StringBuffer sb = new StringBuffer(); String[] newStr = s.split(" "); String result = ""; for (int i = 0; i < newStr.length; i++) { if (newStr[i].length() % 2 != 0) { sb.append(newStr[i]).reverse(); result += sb + " "; } result += newStr[i] + " "; } return result; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine(); System.out.println(secretAgentII(s)); }
代码问题分析
StringBuffer未重置:每次处理奇数长度单词时,sb会保留之前的反转内容,导致累积拼接错误结果- 重复添加原单词:无论是否执行反转分支,都会执行
result += newStr[i] + " ";,造成原单词被重复添加 - 字符串拼接效率低:使用
String的+=会频繁创建新对象,性能较差
修复后的代码
import java.util.Scanner; public class WordReverser { static String secretAgentII(String s) { StringBuilder result = new StringBuilder(); String[] words = s.split(" "); for (int i = 0; i < words.length; i++) { String word = words[i]; if (word.length() % 2 != 0) { // 反转奇数长度的单词 result.append(new StringBuilder(word).reverse()); } else { // 偶数长度单词直接添加 result.append(word); } // 最后一个单词后不添加多余空格 if (i != words.length - 1) { result.append(" "); } } return result.toString(); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine(); System.out.println(secretAgentII(s)); } }
修复说明
- 改用
StringBuilder构建结果,避免频繁创建字符串对象,提升效率 - 处理单个奇数长度单词时,创建独立的
StringBuilder完成反转,避免内容累积 - 优化分支逻辑:仅在对应分支添加反转后或原单词,避免重复输出
- 控制空格添加逻辑,确保最后一个单词后无多余空格,输出格式符合预期
内容的提问来源于stack exchange,提问作者Pratik Bhowmik
相关产品推荐
相关产品推荐

