151.反转字符串中的单词

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

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

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

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

str.trim() 的作用

  • 功能:去除字符串开头和结尾的所有空白字符(whitespace)
  • 空白字符包括:空格( )、制表符(\t)、换行符(\n)、回车符(\r)等
  • 重要特性:只去除首尾空白,不会去除中间的空格

split("\\s+") 的详细解释

a) 正则表达式 "\\s+"

  • \\s:在正则表达式中表示任何空白字符
    • 包括:空格、制表符、换行符、回车符等
    • 注意:Java字符串中 \ 需要转义,所以要写成 \\s
  • +:表示一个或多个前面的字符
    • \\s+ 表示一个或多个连续的空白字符

b) 分割过程

对于 "hello world"

1
2
3
原始字符串: h e l l o [三个空格] w o r l d
↑ ↑ ↑
单词1 分隔符 单词2
  • split("\\s+") 会查找所有连续的空白字符作为分隔符
  • 连续的空格被视为一个分隔符

解法1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.wereash.scut_hot100;

import java.util.Scanner;

/**
* @Author: WereAsh
* @Date:2026-01-19 20:50
**/
public class Solution151 {
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
String string=scanner.nextLine();
string=string.substring(1,string.length()-1);
String[] str=string.trim().split("\\s+");
for (String s:str){
System.out.print(s+",");
}
System.out.println();
StringBuilder sb=new StringBuilder();
for (int i=str.length-1;i>=0;i--){
sb.append(str[i]);
if(i!=0){
sb.append(' ');
}
}
System.out.println(sb);
}
}

解法2

结合58题,分割字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int end = s.length()-1;
int start;
StringBuilder sb=new StringBuilder();
while (end >= 0) {
while (end >=0 && s.charAt(end) == ' ') {
end--;
}
start=end;
while(start>=0&&s.charAt(start)!=' '){
start--;
}
if(end==start) break;
sb.append(s.substring(start+1,end+1));
sb.append(' ');
end=start;
}
String ans= sb.toString();
System.out.println(ans);