** 151.翻转字符串里的单词 **
leetcode链接:https://leetcode.cn/problems/reverse-words-in-a-string/
题目描述:给你一个字符串 s ,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
核心思路:使用双指针进行去空格,主要需要注意的是空格去除的逻辑。

点击查看代码
```cpp
class Solution {
public:
    void reverse(string &s,int start,int end){//这里是交换单个单词,不能重置start
        for(;start < end;start++,end--){
            swap(s[start],s[end]);
        }
    }
    string reverseWords(string s) {
        int fast = 0,slow = 0;
        bool need = false;
        for(;fast < s.size();fast++){//使用bool来判断来处理空格更简单
            if(s[fast] != ' '){
                s[slow++] = s[fast];
                need = true;
                continue;
            }
            if(need){
                s[slow++] = ' ';
                need = false;
            }
        }
        if(s[slow-1]==' '){//需考虑最后一位为空格的情况,如果为空格要去掉
            s.resize(slow-1);
        }
        else {s.resize(slow);}

        slow = 0,fast = s.size() - 1;
        while(slow < fast){//交换首尾的单词
            swap(s[slow],s[fast]);
            slow++,fast--;
        }
        slow = 0,fast = 0;
        for(;fast <= s.size();fast++){//遍历每个单词,分别处理每个单独的单词
            if(fast == s.size() || s[fast] == ' '){
                reverse(s,slow,fast-1);
                slow = fast + 1;
            }
        }
        return s;
    }
};
</details>