字符串中等2 种解法
#151反转字符串中的单词
反转单词顺序,并把单词间的任意连续空格规范为一个空格。
#字符串#双指针
解题主线
01
从右向左扫描可按目标顺序直接追加每个单词,无需先反转整个结果。
解法 1:拆分后逆序
去除两端空格,按连续空格拆词,反转列表后以单空格连接。
时间复杂度
O(n)
空间复杂度
O(n)
java
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
final class Solution {
public String reverseWords(String s) {
String stripped = s.trim();
if (stripped.isEmpty()) return "";
List<String> words = Arrays.asList(stripped.split("\\s+"));
Collections.reverse(words);
return String.join(" ", words);
}
}去除两端空格,按连续空格拆词,反转列表后以单空格连接。
解法 2:从右向左双指针
跳过空格后定位单词左右边界,按出现顺序追加到结果。
时间复杂度
O(n)
空间复杂度
O(n),用于返回字符串
java
final class Solution {
public String reverseWords(String s) {
StringBuilder result = new StringBuilder(s.length());
int right = s.length() - 1;
while (right >= 0) {
while (right >= 0 && s.charAt(right) == ' ') right--;
if (right < 0) break;
int left = right;
while (left >= 0 && s.charAt(left) != ' ') left--;
if (!result.isEmpty()) result.append(' ');
result.append(s, left + 1, right + 1);
right = left - 1;
}
return result.toString();
}
}跳过空格后定位单词左右边界,按出现顺序追加到结果。
边界与易错点
- 结果不能有前导或尾随空格。
- 全空格输入应返回空串。
- String.trim 只处理部分空白;本题输入定义为空格字符。
整理来源
由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。
medium/Q151_reverseWords.java