给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
在做题之前先说一点感想,我一直知道C++和JAVA的代码在效率上有差别,但我没想到在刷PTA(7-32 说反话-加强版 (20分))的时候用JAVA会超时,明明看起来代码非常简洁,后面改用C++就通过了。
第一种情况(使用JAVA编写,此代码无法AC)
思路:
利用String的split方法,将字符串变成一个数组,其中数组中的每一个元素是一个单词,在使用spilt的时候要注意,不能简单的使用" "一个空格分割,而要使用" +"正则表达式,代表当大于等于1个空格的时候分割,因为单词和单词之间可能存在多个空格,另外,在使用split的时候还要特别注意,在使用split的时候,比如要分割" a b c ",分割后的字符串数组大小为4,因为对于最前面的空格(因为使用了split(" +")),所以并不关心开头有多少个空格),也会分割一个""空字符串出来,而对于结尾的空格(同样,因为使用了split(" +")),所以并不关心结尾有多少个空格),则不会产生""空字符串,处理的时候最好使用一下字符串的trim()函数,去掉头尾的空格
代码:
import java.io.IOException;
import java.text.ParseException;
import java.util.Scanner;
public class test {
public static void main(String[] args) throws ParseException, IOException {
Scanner scanner = new Scanner(System.in);
//输入一组单词,去除掉前后空格
String str = scanner.nextLine().trim();
//去除掉单词间的空格,可能不只有一个空格,因此用" +"表示至少一个空格
String[] strs = str.split(" +");
for(int i=strs.length-1;i>=0;--i)
{
System.out.print(strs[i]);
if(i!=0)
System.out.print(" ");
}
}
}
第二种情况(使用C++编写,此代码AC)
思路:
这种做法借用了C++中的vector容器,以及string类的成员函数push_back。具体的思路是首先定义一个字符串变量,比如 string str="",从每个单词的第一个字母开始(既然是每个单词的第一个字母,肯定要使用一个循环去定位每个单词首字母的位置),然后往后判断,如果不是空格,那么就往str中push_back,如果碰到了空格,那么退出循环,当str长度大于0,则将此str值放入vector数组中,最后,从vertor数组中反向取出元素输出即可
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string input="";
//使用getline,因为包含空格的情况,如果使用cin>>input是无法输入空格的
cin >> input;
getline(cin,input);
vector<string> strs;
//count用来定位
int count=0;
//只要还没结束,就让他执行
while(count!=input.length())
{
//声明临时字符串存储
string str="";
//i!=str.length()和 str[i]==' 的顺序最好不要交换,因为会越界(虽然程序没有崩溃)
while(count!=input.length()&&input[count]==' ')
{
count++;
}
while(count!=input.length()&&input[count]!=' ')
{
str.push_back(input[count]);
count++;
}
//这个判断要加上,因为它直接影响了最后vector的大小
if(str!="")
{
strs.push_back(str);
}
}
if(strs.size()>0)
{
cout<<strs[strs.size()-1];
for(int i=strs.size()-2; i>=0; i--)
{
cout<<" "<<strs[i];
}
}
return 0;
}
总结:
使用第一种JAVA代码编写的方法无法AC的原因是运行超时,第一种方法提交代码后发现,耗时很多,难怪无法通过
而使用第二种C++编写的代码,提交,发现:时间较短,提交通过