7-32 说反话-加强版 (20分)

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

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过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++编写的代码,提交,发现:时间较短,提交通过

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值