PAT Basic 1009 说反话 (20)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。
输出格式:每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
思路:
一开始想的是读入一整行,然后开一个int数组a,记录空格在字符串中的位置,数组的第一个元素值为0,最后一个元素为字符串的长度s.length(),这样相当于a[0] ~ a[1], a[1]~a[2], a[n-1]~a[n]就是每个单词,然后打印。(但是总是17/20).
scanf("%[^\n]", str);
int len = strlen(str);
int j=0;
id[j++]=0;
for(int i=0;i<len;i++){
if(!isalpha(str[i])) id[j++]=i;
}
id[j++]=len;
for(int i=j-2;i>=0;i--){
if(i!=0){
for(int k=id[i]+1;k<id[i+1];k++) cout<<str[k];
cout<<" ";
}else{
for(int k=id[i];k<id[i+1];k++) cout<<str[k];
cout<<endl;
}
}
解答:用一个栈每次读入一个单词放入栈中,这样输出的时候就是最后一个单词一直到第一个单词。而且不用特殊处理最后一个单词的问题,因为打印完最后一个单词之后,出栈,栈为空不会在继续循环多打印一个空格。
#include <iostream>
#include <stack>
#include <string>
//AC 20
using namespace std;
int main(){
stack<string> s;
string str;
int flag=0;
while(cin>>str){
s.push(str);
}
while(!s.empty()){
//单词之间打印空格
if(flag) cout<<" ";
else flag = !flag;
cout<<s.top();
s.pop();
}
return 0;
}