//牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。
//同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。
//例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? class Solution {
public:
    string ReverseSentence(string str) {
        string res="",temp="";
        for(unsigned int i=0;i<str.size();i++){
            if(str[i] == ' ')
                res=" "+temp+res,temp="";
            else temp+=str[i];
        }
        if(temp.size())
            res=temp+res;
        return res;
    }
};//从前往后一直读取,遇到空格之后就把之前读取到的压到结果的前面并添加上空格。
//最后当循环结束,如果那个用来读取的字符串不为空,那么就再把它压到结果前,这次就不用再结果的最前面加空格了。 //先整体再局部
class Solution {
public:
    //翻转str从s到e的部分
    void ReverseWord(string &str, int s, int e)
    {
        while(s < e)
            swap(str[s++], str[e--]);
    }
    string ReverseSentence(string str) {
        ReverseWord(str, 0, str.size() - 1); //先整体翻转
        int s = 0, e = 0;
        int i = 0;
        while(i < str.size())
        {
            while(i < str.size() && str[i] == ' ') //空格跳过
                i++;
            e = s = i; //记录单词的第一个字符的位置
            while(i < str.size() && str[i] != ' ') //不是空格 找单词最后一个字符的位置
            {
                i++;
                e++;
            }
            ReverseWord(str, s, e - 1); //局部翻转
        }
        return str;
    }
};
//先局部再整体
class Solution {
public:
    string ReverseSentence(string str) {
        auto size = str.size();
        if(size == 0) return "";
        int mark=0;//标志位,作为单词的起点
        str += ' ';//字符串尾补一个空格
        for(int i = 0; i < size+1; ++i){
            if(str[i] == ' '){//如果遇到空格,则从标志位到空格前一位的字符进行翻转,即每一个单词翻转
                ReverseWord(str, mark, i-1);
                mark = i+1;//每一个单词翻转完后,标志位顺次移动到空格后的字符,即下一个单词的起点
            }
        }
        str = str.substr(0, size);//取字符串str前size个字符,即去掉之前在末尾加上的空格
        ReverseWord(str, 0, size-1);//对整体再进行翻转
        return str;
    }
    void ReverseWord (string &str, int l, int r){
        while(l < r){
            swap(str[l], str[r]);
            ++l;
            --r;
        }
    }
};