HJ13句子逆序

一.题目描述

给出一句英语语句以单词为单位,所以单词之间用空格隔开,除了英文单词以外不含有其他的字符,将单词逆序排放后输出。 alt

二.算法(循环输入流) alt

首先我们要认识到反转的不是字母,是单词的反转。我们可以利用循环输入流每次读入一个单个单词,造成可以读入一个单个的单词的原因就是cin输入流在读入一个空格时候会自动断开,所以利用循环输入流处理可以帮助我们每次读入一个单个的单词,然后将每一个单个单词加到需要返回的字符串的前面即可,下面是完整代码:

#include<bits/stdc++.h>
using namespace std;
int main() {
    string s,str="";
    while(cin>>s) {//循环输入流 ctrl+z表示最后输入结束
        s+= " " +str;
        str=s;
    }
    cout <<str<< endl;
    return 0;
}

时间复杂度:O(n)O(n) 需要去读入字符串

空间复杂度:O(n)O(n) 需要开辟空间返回最后的字符串

三.算法(模拟)

我们可以一次性读入整个一句英语语句,然后利用整个字符串的空格的进行分割存入入每一个单词,然后将所有的单词反转后输出,下面是完整的代码:

#include<bits/stdc++.h>
using namespace std;
int main() {
    vector<string>q;
    string s;
    getline(cin, s);
    string str="";
    for(int i=0;i<s.size();i++){
        if(s[i]!=' '){//不是空格就记录下每一个字符
            str+=s[i];
        } else {
            //是空格则说明是一个单词已经记录了 需要放入vector中了
            q.push_back(str);
            str="";
        }
    }
    q.push_back(str);//细节注意一下 最后一个单词要在循环外填入
    for(int i=q.size()-1;i>=0;i--){//可以将所有的单词倒序输出即可
        if(i!=q.size()-1){
            cout<<" "<<q[i];
        } else {
            cout<<q[i];
        }
    }
    cout<<endl;
    return 0;
}

时间复杂度:O(n)O(n) 需要去读入字符串

空间复杂度:O(n)O(n) 需要开辟空间返回最后的字符串