151. 反转字符串中的单词

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = "the sky is blue"
输出:"blue is sky the"
示例 2:

输入:s = " hello world "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。
分析:参考storm大神写法
为了将字符串 s 中的单词顺序反转,可以反向遍历字符串 s,将每个单词依次拼接到结果字符串中。
由于给定的字符串可能有额外的空格,结果字符串不能有额外的空格,因此需要对额外的空格做处理。
需要创建两个 StringBuffer 类型的对象 reversed 和 curr,其中 reversed 存储结果字符串,curr 存储当前的单词。
反向遍历字符串的过程中,每次遍历完一个单词时,将该单词拼接到结果字符串,并确保结果字符串中的相邻单词之间有一个空格。
具体做法是,反向遍历字符串的过程中,对于遍历到的每个字符,判断当前字符是否为空格,执行相应的操作。
如果当前字符是空格,则当 curr 不为空时,遍历完一个单词,此时 curr 为遍历完的单词的反转之后的结果,需要将遍历完的单词拼接到 reversed。
判断 reversed 是否为空,如果不为空则将一个空格拼接到 reversed,确保上一个单词和当前单词之间有一个空格。
将 curr 反转之后的结果拼接到 reversed,然后将 curr 清空。
如果当前字符不是空格,则将当前字符拼接到 curr。
遍历结束之后,如果 curr 不为空,则还剩一个单词需要拼接到结果字符串。首先判断 reversed 是否为空,
如果不为空则将一个空格拼接到 reversed,如果为空则不拼接空格,然后将 curr 反转之后的结果拼接到 reversed。
上述操作结束之后,reversed 即为字符串 s 中的单词顺序反转之后的结果。

class Solution {
public String reverseWords(String s) {
StringBuffer reversed = new StringBuffer();
StringBuffer curr = new StringBuffer();
for (int i = s.length() - 1; i >= 0; i--) {
char c = s.charAt(i);
if (c == ' ') {
if (!curr.isEmpty()) {
if (!reversed.isEmpty()) {
reversed.append(' ');
}
reversed.append(curr.reverse());
curr.setLength(0);
}
} else {
curr.append(c);
}
}
if (!curr.isEmpty()) {
if (!reversed.isEmpty()) {
reversed.append(' ');
}
reversed.append(curr.reverse());
}
return reversed.toString();
}
}

posted @ 2026-03-27 22:21  大头海绵宝宝  阅读(3)  评论(0)    收藏  举报