# 0151. Reverse Words in a String
###### tags: `Leetcode` `Microsoft` `Medium`
Link: https://leetcode.com/problems/reverse-words-in-a-string/
## 思路
只要按照题目要求来就可以做出来
### 思路一
用trim,split和reverse
**有非常多新奇的语法 体现了java的酷炫**
### 思路二
手动自己写函数
### 思路三 双端队列
**注意语法**
## Code
### 思路一
```java=
class Solution {
public String reverseWords(String s) {
//去除前后空白
s = s.trim();
// 正则匹配连续的空白字符作为分隔符分割
//list 将需要转化的数组作为参数
//split() 方法用于把一个字符串分割成字符串数组
// \\s代表空格,+号代表一个或者多个
List<String> wordList = Arrays.asList(s.split("\\s+"));
Collections.reverse(wordList);
return String.join(" ",wordList);
}
}
```
### 思路二
```java=
class Solution {
public String reverseWords(String s) {
StringBuilder sb = trimSpaces(s);
// 翻转字符串
reverse(sb, 0, sb.length() - 1);
// 翻转每个单词
reverseEachWord(sb);
return sb.toString();
}
public StringBuilder trimSpaces(String s) {
int left = 0, right = s.length() - 1;
// 去掉字符串开头的空白字符
while (left <= right && s.charAt(left) == ' ') {
++left;
}
// 去掉字符串末尾的空白字符
while (left <= right && s.charAt(right) == ' ') {
--right;
}
// 将字符串间多余的空白字符去除
StringBuilder sb = new StringBuilder();
while (left <= right) {
char c = s.charAt(left);
if (c != ' ') {
sb.append(c);
} else if (sb.charAt(sb.length() - 1) != ' ') {
sb.append(c);
}
++left;
}
return sb;
}
public void reverse(StringBuilder sb, int left, int right) {
while (left < right) {
char tmp = sb.charAt(left);
sb.setCharAt(left++, sb.charAt(right));
sb.setCharAt(right--, tmp);
}
}
public void reverseEachWord(StringBuilder sb) {
int n = sb.length();
int start = 0, end = 0;
while (start < n) {
// 循环至单词的末尾
while (end < n && sb.charAt(end) != ' ') {
++end;
}
// 翻转单词
reverse(sb, start, end - 1);
// 更新start,去找下一个单词
start = end + 1;
++end;
}
}
}
```
### 思路二
定义[left,right]为需要读取单词的区间
指针left、right定义为在去掉字符串首尾空格后字符串的首尾位置
1.去掉字符串首尾左右空格,移动left、right指针指向去掉空格后的首尾位置。
while(left<=right){
2.从后往前一个个遍历单词,设置index指针,指向right位置,index从后往前遍历,直到遇到空格或者末尾
说明此时已经将其中一个单词遍历完。
3.此时index+1为该单词的首位,遍历字符串[index+1,right]区间,加入到StringBuffer中
4.判断index位置,加入空格:若index位置已经到达头位置了,说明不需要添加空格,否则都需要添加空格隔开单词
5.index继续从后往前遍历,跳过空格直到遇到非空字符,将right指向index的位置执行下一次循环
}
6.返回StringBuilder.toString();
```java=
class Solution {
public String reverseWords(String s) {
StringBuffer sb = new StringBuffer();
int start = 0, end = s.length()-1;
while(s.charAt(start)==' ')start++;
while(s.charAt(end)==' ')end--;
int idx = end;
while(start<=end){
while(idx>=start && s.charAt(idx)!=' '){
idx--;
}
for(int i = idx+1;i <= end;i++){
sb.append(s.charAt(i));
}
if (idx+1 != start) {
sb.append(' ');
}
while(idx>=start && s.charAt(idx)==' ')idx--;
end = idx;
}
return sb.toString();
}
}
```
### 思路三
```java=
class Solution {
public String reverseWords(String s) {
int left = 0, right = s.length()-1;
while (left <= right && s.charAt(left) == ' ') {
++left;
}
while (left <= right && s.charAt(right) == ' ') {
--right;
}
Deque<String> d = new ArrayDeque<>();
StringBuffer sb = new StringBuffer();
while(left<=right){
char c = s.charAt(left);
if(sb.length()!=0 && c==' '){
d.offerFirst(sb.toString());
sb.setLength(0);
}
else if(c != ' '){
sb.append(c);
}
++left;
}
d.offerFirst(sb.toString());
return String.join(" ",d);
}
}
```