/*方法一:使用额外空间
思路与算法
开辟一个新字符串。然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词,并能得到单词的起止位置。随后,根据单词的起止位置,可以将该单词逆序放到新字符串当中。如此循环多次,直到遍历完原字符串,就能得到翻转后的结果。*/
char * reverseWords(char * s){
    int len = strlen(s);
    char* Rets = (char*)calloc(len+1,sizeof(char));
    int left=0,right=0,n=0;
    for (int i=0; i<len; i++)
    {
        if (s[i] == ‘ ‘)
        {
            right = i-1;
            for (int j=right; j>=left; j--) Rets[n++] = s[j];
            Rets[n++] = ‘ ‘;
            left = i+1;
        }
        else if(i == len-1)
        {
            right = i;
            for (int j=right; j>=left; j--) Rets[n++] = s[j];
        }
    }
    return Rets;
}
/*方法二:原地解法
思路与算法
此题也可以直接在原字符串上进行操作,避免额外的空间开销。当找到一个单词的时候,我们交换字符串第一个字符与倒数第一个字符,随后交换第二个字符与倒数第二个字符…… 如此反复,就可以在原空间上翻转单词。
需要注意的是,原地算法在某些语言(比如 Java,JavaScript)中不适用,因为在这些语言中 String 类型是一个不可变的类型。*/
char* reverseWords(char* s) {
    int length = strlen(s);
    int i = 0;
    while (i < length) {
        int start = i;
        while (i < length && s[i] != ‘ ‘) i++;
        int left = start, right = i - 1;
        while (left < right) {
            char tmp = s[left];
            s[left++] = s[right], s[right--] = tmp;
        }
        while (i < length && s[i] == ‘ ‘) i++;
    }
    return s;
}
原文:https://www.cnblogs.com/ganxiang/p/13626619.html