7-32 说反话-加强版(20 分)
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
思路:递归—倒着遍历字符串遇到下个字符非空格就继续进行递归,否则输出该字符,试了下但是超时了!然后就用栈重写了一遍,遇到不是空格就入栈,否则将栈全部输出,至于细节处理还是看代码吧。
提供第三个测试点的一组数据:
输入样例:
a
输出样例:
a
注意前后没有多余空格!
递归代码如下:
#include<stdio.h> #include<string> #include<iostream> using namespace std; int f(string s, int pos, int len=0) { if (pos == 0){ //当碰到第一个字符时,输出并返回 cout << s[pos]; return 1; } if (s[pos - 1] == ' '){ cout << s[pos]; //当下一个字符为空格时,输出并返回 return 1; } int flag = 1 + f(s, pos - 1, len + 1); //flag为当前的单词长度 cout << s[pos]; return flag; } int main() { string line; getline(cin, line); string container; int first = 0; //first用来解决空格输出,第一个单词不输出空格 for (int i = line.length() - 1; i >= 0; i--) { int flag = 0; if (line[i] != ' '){ if (first != 0) cout << " "; flag = f(line, i); i -= flag; //一个单词输出后,该单词的字符将不进行你个查询 first++; } } cout << endl; return 0; }
AC代码如下:
#include<stdio.h> #include<string> #include<stack> #include<iostream> using namespace std; int main() { string line; getline(cin, line); stack<char> cnt; //借用栈来保存字符 int first = 0; //first用来解决空格输出,第一个单词不输出空格 for (int i = line.length() - 1; i >= 0; i--) { if (line[i] != ' '&&i!=0) cnt.push(line[i]); else { if (first != 0&&!cnt.empty()) cout << " "; if (i == 0 && line[0] != ' ') cnt.push(line[0]); int flag = 0; while (!cnt.empty()){ //遇到空格或者i=零,只要栈非空则输出 cout << cnt.top(); cnt.pop(); flag = 1; } if (flag==1) //只有单词输出才能加一 first++; } } cout << endl; return 0; }
如果有不懂得栈的,推荐以下