
本文详解 java 中按单词反转字符串的算法原理与常见陷阱,重点分析双指针法中索引边界处理的关键细节,并提供修复后的完整可运行代码。
本文详解 java 中按单词反转字符串的算法原理与常见陷阱,重点分析双指针法中索引边界处理的关键细节,并提供修复后的完整可运行代码。
在 Java 中实现“单词级反转”(如将 "I like ice cream!" 变为 "cream! ice like I")看似简单,但极易因索引边界误判导致逻辑错误。核心思路是:先逐个反转每个单词,再反转整个字符数组——这需要两次调用 reverse(char[] s, int start, int end) 辅助方法。然而,原始代码中 reverseWords 方法内调用 reverse(s, start, end) 时,未排除空格字符本身,导致单词首尾与空格被错误交换,破坏单词完整性。
? 关键问题:end 索引的语义误解
在 reverseWords 的 for 循环中,当 s[end] == ' ' 成立时,end 指向的是空格所在位置(例如 "I " 中空格索引为 1)。此时若直接调用 reverse(s, start, end),则反转范围包含 s[start] 到 s[end](含空格),结果如 "I " 会变成 " I"(空格移到开头),后续整体反转后严重错乱。
✅ 正确做法是:仅反转单词内部字符,即范围应为 [start, end - 1],将空格排除在外:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
if (s[end] == ' ') {
reverse(s, start, end - 1); // ✅ 修正:end-1 确保不包含空格
start = end + 1;
}
? 完整修复版代码(含注释)
import java.util.*;
public class StringProblems {
// 双指针原地反转 [start, end] 区间内的字符(闭区间)
static void reverse(char[] str, int start, int end) {
while (start <h3>⚠️ 注意事项与最佳实践</h3>
- 变量作用域隔离:reverse 方法中的 start/end 参数与 reverseWords 中同名变量完全独立,修改前者不影响后者——这是 Java 值传递(基本类型)的特性,无需担心跨方法污染。
- 边界安全:循环条件使用 end
- 输入鲁棒性:当前代码假设输入含空格分隔的单词。如需支持连续空格、首尾空格或空字符串,建议预处理(如 trim() + split("\s+")),但会失去原格式(如标点紧邻空格的位置)。
- 时间复杂度:O(n),每个字符最多被交换 2 次;空间复杂度:O(1)(原地操作)。
掌握这一模式不仅能解决单词反转问题,更是理解双指针技巧与索引边界的经典范例——记住:识别分隔符时,操作范围永远不包含分隔符本身。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










