给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
分析:
完成此题我们需要两个步骤:1,先把原话的每个单词自我翻转(即变成olleH dlroW ereH I emoC)2,在整体翻转(即变成Come I Here World Hello)。
代码展示如下:
#include<stdio.h>
#include<string.h>
void reverseWords(char * s){
int count=0;
char temp=0;
int i=0,j=0,k=0;
int leap=0;
while(s[i]!=0)
{
for(;;++i)
{
if(s[i]==32||s[i]==0)
break;
}
count=i-k;
leap=count-1;
for(j=k;j<(k+count/2);++j)
{
temp=s[j+leap];
s[j+leap]=s[j];
s[j]=temp;
leap=leap-2;
}
for(;;++i)
{
if(s[i]!=32)
break;
}
k=i;
}
return s;
}
void reverseString(char* s){
int i=0;
int len=strlen(s);
char temp=0;
for(i=0;i<(len/2);++i)
{
temp=s[len-1-i];
s[len-1-i]=s[i];
s[i]=temp;
}
}
int main(void)
{
char s[500003]={0};
int i=0;
int count=0;
int character=0;
int len=0;
gets(s);
reverseWords(s);
reverseString(s);
len=strlen(s);
for(i=len-1;;--i)
{
if(s[i]!=32)
break;
if(s[i]==32)
s[i]=0;
}
for(i=0;s[i]!=0;++i)
{
if(s[i]==32&&character==0)
continue;
if(s[i]==32&&count==0)
{
printf("%c",s[i]);
++count;
continue;
}
if(s[i]!=32)
{
printf("%c",s[i]);
count=0;
++character;
}
}
return 0;
}