你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

7-32 说反话-加强版

2021/12/26 13:18:15

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

输入格式:

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

输出格式:

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

输入样例:

Hello World   Here I Come



结尾无空行

输出样例:

Come I Here World Hello



结尾无空行

解题思路:

从最后一个元素开始遍历,记录当前开始遍历的位置,遇到空格时并且空格前一个元素不为空格时(因为题目说可能会有多个空格,如果前一个元素还是空格就继续遍历直到不为空格);

从当前空格位置后一个元素开始到开始遍历记录的位置就是分割出的单词,然后打印一个空格分隔单词,更新记录位置为当前空格位置;

对于全为空格或者末尾有空格的,需加入一个变量(我这用的flag)判断,如果之前打印了单词把flag变量的值改变,才打印空格来分隔单词;

如果最前面有空格的话就注意最后打印出来不能有空格,用我们之前记录遍历位置的变量来判断,如果最前面有空格,那么最后记录遍历位置的变量值为0,此时我们只需在打印空格时多加一条变量值大于0即可;

代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    char a[500001];
    int len,i,j,count=0;
    gets(a);
    len=strlen(a);
    int p=len;
    int flag = 0;
    for(i=len-1;i>=0;i--)
    {
        if(a[i]==' '&&a[i-1]!=' ')
        {
            for(j=i+1;j<p;j++)
            {
                if(a[j]!=' ')
                {
                printf("%c",a[j]);
                flag = 1;
                }
            }
            p=i;
            if(flag==1&&p>0){
               printf(" ");
            }
        }
    }
    for(i=0;i<p;i++)
    {
        if(a[i]!=' ')
        {
        printf("%c",a[i]);
        }
    }
}

通过了全部测试点

在这里插入图片描述