10行代码AC——7-2 说反话-加强版 (20 分)——解题报告

    xiaoxiao2024-11-08  139

    励志用尽量少的代码做高效的表达。


    题目描述

    给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

    输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。

    输出格式: 每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。

    输入样例: Hello World Here I Come 输出样例: Come I Here World Hello


    分析:

    本题的实质是考察串的倒序运算。 解法1:STL容器中stack栈为容器操作。 定义string型栈,逐个存入单词后,从栈顶依次输出即为倒叙。优点是时间复杂度较小:O(n),缺点是代码相对较长。

    解法2:使用algorithm头文件中的reverse()函数翻转。 存入容器后,直接调用翻转函数即可。优点是代码简洁,只有10行;缺点是时间复杂度较大:O(nlogn)。

    传送门1——>懒癌的福音——algorithm头文件函数全集 强烈推荐读者把两种解法都尝试一下,都是很常用的方法。

    代码1:stack栈解法

    #include <iostream> #include <stack> #include <string> using namespace std; int main() { stack<string> s; //建立字符串型stack栈 string sp; //声明字符串 bool flag=false; while(cin>>sp){ s.push(sp); } //需要注意的是:输入结束要手动输入^z作为结束标志 //zcout<<"!!!!!!!!!!"<<endl; 这里可以测试截止到目前为止代码是否错误。 while(!s.empty()) { if(flag) cout<<" "; else flag=true; cout<<s.top(); //输出一个元素 s.pop(); //移除一个元素 } return 0; }

    代码2:reverse()解法

    #include<bits/stdc++.h> //万能头文件 using namespace std; int main() { vector<string>v; string s; while(cin>>s) v.push_back(s); reverse(v.begin(),v.end()); for(int i = 0; i < v.size(); i++) cout << (i == 0 ? "" : " ") << v[i]; return 0; }

    stack函数总结:

    empty() 堆栈为空则返回真 pop() 移除栈顶元素 push() 在栈顶增加元素 size() 返回栈中元素数目 top() 返回栈顶元素


    择苦而安,择做而乐,虚拟现实终究比不上真实精彩之万一。

    最新回复(0)