【PTA天梯赛训练题】说反话-加强版

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

输入格式:

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

输出格式:

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

输入样例:

Hello World   Here I Come

输出样例:

Come I Here World Hello

 难点分析

1.思路:从最后往前遍历,不是空格放入数组储存,遇到空格把数组输出,清空数组;

2.注意:一个单词输入时前面有空格、后面有空格的情况;i==0时(可能是空格,可能是字母,要及时跳出循环)的特殊情况;

测试点 提示 结果 耗时 内存
0 sample 答案正确 2 ms 368 KB
1 一个词,末尾有空格 答案正确 2 ms 224 KB
2 最小词,前有空格 答案正确 1 ms 232 KB
3 只有空格 答案正确 2 ms 288 KB
4 最大句子,卡strcat:前500000个字母组成1个单词,后面每个单词1个字母 答案正确 41 ms 1408 KB

 

代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char s[500001],c[500001];
    int i,j,k,u=0,count=0,flag;
    gets(s);
    k=strlen(s);
    for(i=k-1; i>=0; i--)
    {
        if(s[i]!=' ')
        {
            c[u]=s[i];
            u++;
        }
        if(i==0)
        {
            if(u>0&&count>0) printf(" ");
            flag=0;
            for(j=u-1; j>=0; j--)
            {
                printf("%c",c[j]);
                flag=1;
            }
            if(flag==1) count++;
            break;
        }
        if(s[i]==' '&&s[i+1]!=' '&&count!=0)
        {
            flag=0;
            if(u>0) printf(" ");
            for(j=u-1; j>=0; j--)
            {
                printf("%c",c[j]);
                flag=1;
            }
            if(flag==1) count++;
            u=0;
        }
        if(s[i]==' '&&s[i+1]!=' '&&count==0)
        {
            flag=0;
            for(j=u-1; j>=0; j--)
            {
                printf("%c",c[j]);
                flag=1;
            }
            if(flag==1) count++;
            u=0;
        }
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/weixin_44153125/article/details/88870883
今日推荐