2020oop第一次7-1 说反话-加强版 (20分)

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

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。

输出格式:

每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。

输入样例:

Hello World   Here I Come

输出样例:

Come I Here World Hello

最初代码(AC)


#include <stdio.h>
#include<string.h>
int main()
{
    char a[500001];
    gets(a);
    int i,l,j,word=0,flag=1;//flag是记录空格的,word是统计单词长度的
    l=strlen(a);//测量长度
    for(i=l-1;i>=0;i--)//倒序检查
    {     if(a[i]!=' ') word++;//开始统计单词长度
        else if(word!=0&&a[i]==' ')//遇到第一个空格单词结束
        {if(flag==1) flag=0;// 遇到多个空格的处理方法
        else printf(" ");
        for(j=i+1;j<=i+word;j++)
        printf("%c",a[j]);//开始一个一个输出单词
        word=0;
        }
    }if(word>0)//输出最后一个单词,主要是控制输出格式用的
    {
        if(flag==0) printf(" ");
        for(j=0;j<=word-1;j++)
        printf("%c",a[j]);
    }
    return 0;
}

后来的代码

#include<iostream>
#include<string.h>
using namespace std;
char a[500000];
int main(){
    gets(a);//string 输入时遇到空格、换行等空白输入就会停止,所以采用gets函数,但是在PTA上会有Warming提示
    int la=strlen(a),k=0;//k用来记录一个单词的长度 ,记得初始化
    
    for(int i=la-1;i>=0;i--)//说反话,那就反过来
    {
        if(a[i]!=' ')//不是空格时+1
            k++;
        else {
            if(a[i]==' '&&k!=0){//k!=0是用来筛除多个空格的情况
                for(int j=0;j<=k;j++)
                    cout<<a[i+1+j];
                k=0;
            }
        }
    }
    
    if(k>0){//别漏了第一单词前并没有空格的情况
        for(int i=0;i<k;i++)
            cout<<a[i]<<"*";
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45788060/article/details/108121544