题目
给定一句英语,本题要求编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
参考解答:
法一:全按字符处理
#include<stdio.h>
#include<string.h>
int main()
{
int len,i,low,top,m,n;
char s[500001];
gets(s);
len=strlen(s);
top=len,low=0;//初始化
for(i=0;i<len;i++)//排除词前所有空格,记录第一个字母的下标。
{
if(s[i]!=' ')
{
low=i;
break;
}
}
for(i=len-1;i>=0;i--)//排除词后所有空格,记录最后一个字母的下标。
{
if(s[i]!=' ')
{
top=i;
break;
}
}
for(i=top;i>=low;i--)
{
if(i==low)
for(m=low;m<=top;m++)
{
if(s[m]==' ')//当遇到空格,说明已经结束,退出循环
{
break;
}
printf("%c",s[m]);
}
if(s[i]==' ')//此项为空格,说明已遍历过一个单词
{
for(n=i+1;n<=top;n++)//开始将单词反转
{
if(s[n]==' ')//此项为空格,说明单词已输出完毕,或单词还未出现
break;
printf("%c",s[n]);
}
if(s[i-1]!=' ')//前一位不是空格,说明是新的单词,输出空格分隔
printf(" ");
}
}
}
法二:按字符串处理
#include<stdio.h>
int main(){
char str[20][81],temp;//每个单词分别存在字符串数组里
int i;
scanf("%s",str[0]);//先吃一个单词再进行判断
for(i=1;(temp=getchar())!='\n';i++){
//用temp吃掉下一个字符,吃掉'\n'则退出循环,吃掉了空格,则继续
scanf("%s",str[i]);
}
for(i--;i>=0;i--){//倒序输出
printf("%s",str[i]);
if(i!=0)printf(" ");
}
return 0;
}