
本文详解如何通过双层反转法(先逐词反转再整体反转)实现用户输入字符串的单词级逆序,重点剖析 reverseWords 方法中边界处理的关键细节及常见逻辑错误。
本文详解如何通过双层反转法(先逐词反转再整体反转)实现用户输入字符串的单词级逆序,重点剖析 `reversewords` 方法中边界处理的关键细节及常见逻辑错误。
在 Java 中实现“单词级反转”(如将 "I like ice cream!" 变为 "cream! ice like I"),核心思想是:先对每个单词内部字符反转,再对整个字符串反转。这避免了直接分割字符串带来的额外空间开销,属于经典的原地算法优化。
但原始代码存在一个关键逻辑缺陷:在 reverseWords 方法中,当检测到空格 s[end] == ' ' 时,调用 reverse(s, start, end) 会错误地将空格也纳入反转范围——因为 reverse 函数执行的是闭区间 [start, end] 的字符交换,而 end 此时正指向空格位置。例如字符串 "I "(索引0='I',索引1=' '),调用 reverse(s, 0, 1) 将导致 'I' 和 ' ' 互换,结果变为 " I",破坏单词结构。
✅ 正确做法是:空格仅作为分隔符,不应参与单词内反转。因此,在识别到空格时,应将反转区间设为 [start, end - 1],即只反转当前单词的字符部分:
if (s[end] == ' ') {
reverse(s, start, end - 1); // 关键修正:排除空格
start = end + 1;
}
随后需补全末尾单词的反转(因循环结束时未触发空格条件),再执行一次全局反转:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
reverse(s, start, s.length - 1); // 反转最后一个单词 reverse(s, 0, s.length - 1); // 反转整个字符串,完成单词顺序倒置
完整修正后的 reverseWords 方法如下:
static char[] reverseWords(char[] s) {
int start = 0;
for (int end = 0; end <p>⚠️ 注意事项:</p>
- 所有 reverse 调用均基于 char 数组的引用传递,因此修改会直接影响原数组,无需返回值(但方法仍返回数组以支持链式调用);
- 若输入字符串首尾含空格或含连续空格,该实现不会自动压缩空格——如需健壮性处理,建议先使用 trim() 和 split("\s+") 配合 StringBuilder,但本方案聚焦原地高效实现;
- reverse 辅助方法采用双指针交换,时间复杂度 O(n),空间复杂度 O(1),符合算法最优实践。
运行示例:
enter the string to be reversed I like ice cream! cream! ice like I
该方案不仅解决了原始代码的边界错误,更体现了“分而治之+两次反转”的经典算法思维——理解每一步操作的语义边界,是写出健壮字符串处理逻辑的关键。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










