PAT基础练习集 说反话-加强版
题目描述:
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
**
输入格式
**:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
**
输出格式:
**
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
**
输入样例:
**
Hello World Here I Come
**
输出样例:
**
Come I Here World Hello
题目链接:PTA—说反话—加强版
用Python解题思路:
1.从给出的条件:用“空格”分割的单词,而我们知道cin和scanf都是不读入空格的,也就是读到空格就退出读入。还有一个条件就是以回车结束字符串的输入,那么’\n’就是退出循环的条件。而我们只要把每个单词都存入数组,然后倒着输出就好了
2.但是当我们使用C/C++做这题时,会发现如果在回车前有空格,getchar()就读不到’\n’,这样程序就会一直运行,导致超时。(这个方法如果有方法也能写,不过麻烦)
3.这样一来就能想到用Python,因为Python有强大的处理字符串的能力,而且它的列表类型能存入许多字符串,并且可以简单地使用[::-1]将列表逆序。
4.代码如下,7行解决。
#使用异常处理是因为如果只读入空格,列表中不会存,导致数组越界
try:
x = list(input().split()) #split()默认空格分隔(可以是多个)
for i in x[:-len(x):-1]: #循环到-len(x),控制输出
print(i+" ",end="")
print(x[0])
except IndexError:
exit(0)
用C++解题思路
很简单,先读入字符串,然后一个一个判断。
由于判断条件涉及到空格,我们就需要把首尾的空格去除,这里要用到:
s.erase(0,s.find_first_not_of(" ")); //去除首尾空格
s.erase(s.find_last_not_of(" ") + 1);
AC代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
int i,len,j;
getline(cin,s);
s.erase(0,s.find_first_not_of(" ")); //去除首尾空格
s.erase(s.find_last_not_of(" ") + 1);
if(s == "") //若空,直接退出
return 0;
len = s.length();
for(i=len-1;i>=0;i--)
{
if(s[i] == ' ' && s[i+1] != ' ' &&i<=len-2)
{
for(j=i+1;j<len && s[j]!=' ';j++)
cout<<s[j];
cout<<" ";
}
}
for(i=0;s[i]!=' ';i++)
cout<<s[i];
return 0;
}
欢迎在评论区留言,觉得好的话给作者第一篇文章点个赞吧,谢谢!