给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
参考代码:
#include<stdio.h>
#include<string.h>
int main()
{
char s[500001];
gets(s);
int len=strlen(s);
s[len]=' '; //在字符串尾添加空格
int i,j,t,flag=0;//flag用于控制格式输出
for(i=len;i>0;i--) //从后向前遍历
{
if(s[i]==' '&&s[i-1]!=' ')//如果该字符为一个单词的尾部
{
t=i-1; //记下该字符位置
}
if(s[i]!=' '&&s[i-1]==' ')//如果该字符为一个单词的首部
{
if(flag==0)
{
flag=1;
}
else
{
printf(" ");
}
for(j=i;j<=t;j++) //输出一个单词
{
printf("%c",s[j]);
}
}
}
if(s[0]!=' ') //如果字符串第一个单词前没有空格
{
if(flag==1) printf(" ");
for(j=0;j<=t;j++) //输出第一个单词
{
printf("%c",s[j]);
}
}
return 0;
}
思路:
首先我在字符串尾部添加了一个空格,方便接下来的处理。接着从后向前遍历,同时判断该字符与前一字符,如果该字符为空格,前一字符不为空格,则前一字符的位置为一个单词的尾部,记下该位置;如果该字符不为空格,前一字符为空格,则该字符的位置为一个单词的首部,输出单词。这里我判断该字符是否为单词首部是通过判断该字符不为空格,前一字符为空格,但是如果是字符串的第一个单词,可能会出现第一个单词前没有空格,所以第一个单词需要单独处理。这题易错的点主要是格式输出,程序中我定义了一个flag用于控制格式输出。具体步骤参考代码及注释。