首页 > 代码库 > 【编程题目】翻转句子中单词的顺序

【编程题目】翻转句子中单词的顺序

第 10 题(字符串)
翻转句子中单词的顺序。
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。

 

思路:用栈,把每个单词压入栈,再依次弹出输出。

/*第 10 题(字符串)翻转句子中单词的顺序。题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。start time 15:12end time 15:39*/#include <iostream>#include <vector>using namespace std;typedef struct Words{    int len;    char * start;}Words;void reverseSentence(char * c){    vector<Words> S; //存储单词的栈    Words w;    w.start = c;    w.len = 0;    for (int i = 0; c[i] != \0; i++)    {        if (c[i] !=  )        {            w.len++;        }        else        {            if (w.len != 0)            {                S.push_back(w);                w.start = c + i + 1;                w.len = 0;            }            else //跳过多余的空格            {                w.start = c + i + 1;            }        }    }    if (w.len != 0) //压入最后一个词    {        S.push_back(w);    }    while (!S.empty())    {        Words w = S.back();        for (int i = 0; i < w.len; i++)        {            cout << *(w.start + i);        }        cout <<  ;        S.pop_back();    }    cout << endl;}int main(){    char * c = "  I   am  a student.";    reverseSentence(c);    return 0;}

 

网上找答案,发现我的方法空间复杂度很高,O(n)网上通用的方法是原地翻转句子,再把每个单词翻转回来。

http://www.cnblogs.com/yanhaiming/archive/2012/07/17/2595817.html

#include<iostream>#include<vector>#include<assert.h>#include<cstring>using namespace std;void swap(char &a, char &b){    char tmp = b;    b = a;    a = tmp;} void swap_str(char* str, int start, int end){    assert(str!=NULL && start <= end);    int low = start;    int high = end;     //整个句子按字符翻转    while (low < high)    {        swap(str[low], str[high]);        low++;        high--;    }}//方法一:依次读入句子中的每个单词,并将它们放入一个栈中。然后再将单词出栈。//时间复杂度:O(n),空间复杂度:O(n); //方法二:首先将整个句子按字符翻转,然后再将其中每个单词的字符旋转。//时间复杂度:O(n),空间复杂度:O(1);void reverse_word(char str[]){    int len = strlen(str);     //翻转整个句子    swap_str(str, 0, len-1);     int s = 0;    int e = 0;    //翻转每个单词    for (int i=0; i<len; i++)    {        e = i;        if (str[e] ==  )        {            //str[e]为空格,所以范围是[s,e-1].            swap_str(str, s, e-1);            s = e + 1;        }    }} int main(){    char str[] = "I am a student.";    reverse_word(str);    cout<<str<<endl;    return 0;}

 

【编程题目】翻转句子中单词的顺序