JAVA练习372- 反转字符串中的单词

发布时间:2026/7/30 14:19:12
JAVA练习372- 反转字符串中的单词 题目概览给你一个字符串s请你反转字符串中单词的顺序。单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。注意输入字符串s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中单词间应当仅用单个空格分隔且不包含任何额外的空格。示例 1输入s the sky is blue 输出blue is sky the示例 2输入s hello world 输出world hello 解释反转后的字符串中不能存在前导空格和尾随空格。示例 3输入s a good example 输出example good a 解释如果两个单词间有多余的空格反转后的字符串需要将单词间的空格减少到仅有一个。提示1 s.length 104s包含英文大小写字母、数字和空格 s中至少存在一个单词来源151. 反转字符串中的单词 - 力扣LeetCode解题分析方法双指针思路从字符串末尾开始向前遍历使用双指针i和j标记每个单词的起始和结束位置。当遇到空格时如果i1 ! j说明找到了一个单词将其加入结果中。算法步骤初始化i n, j nStringBuilder sb new StringBuilder()从后向前遍历字符串while(--i 0)如果s.charAt(i) 如果i1 ! j说明[i1, j)是一个单词如果结果字符串非空先添加一个空格将单词s.substring(i1, j)追加到结果中更新j i继续向前寻找下一个单词遍历结束后如果j 0说明开头还有一个单词从 0 到 j同样处理返回sb.toString()关键点反向遍历可以避免处理前导空格的问题i1 ! j的判断确保不会将连续空格当作单词只在结果非空时添加空格保证单词间只有一个空格时间复杂度O(n)需要遍历整个字符串一次空间复杂度O(n)使用了StringBuilder存储结果class Solution { public String reverseWords(String s) { int n s.length(), i n, j n; StringBuilder sb new StringBuilder(); while(--i 0) { if (s.charAt(i) ) { if (i 1 ! j) { if (sb.length() 0) { sb.append( ); } sb.append(s.substring(i1, j)); } j i; } } if (j 0) { if (sb.length() 0) { sb.append( ); } sb.append(s.substring(0, j)); } return sb.toString(); } }示例解析以s the sky is blue为例从末尾开始i指向 e向前移动直到遇到空格找到单词 blue添加到结果中继续向前找到 is、sky、the最终结果为 blue is sky the