给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过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;
}