7-32 说反话-加强版

7-32 说反话-加强版

文章目录

    • 7-32 说反话-加强版
    • 题目描述:
    • 输入格式:
    • 输出格式:
    • 输入与输出样例:
    • 思路分析:
    • 代码:
    • 样例:

题目描述:

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

输入格式:

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

输出格式:

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

输入与输出样例:

7-32 说反话-加强版_第1张图片

思路分析:

该题一开始时候,就以为单词都是开头字母为大写,就以大写为基准来写,搞到只对了个样例子,所以应该以空格为间隔来反转输出单词,当遇到空格说明,已经出来了一个单词。那么从最后一个单词开始向前推进,遇到空格时,就记录空格下标,开始向后输出,直到遇到下一个空格下标或者到达字符串末尾,如果单词之间有多个空格,那么以第一个空格下标为主,如果下一个下标字符不是空格就输出。废话不多说,直接上代码。

代码:

#include
#include 
int main()
{
	int a,b,c,d;
	char c1[500001];
	gets(c1);
	a=strlen(c1);
	d=a,c=0;//这一步 是当无单词,全空格的情况,赋值。 
	for(b=0;b<a;b++)//排除前面词中的所有空格,记录第一个字母出现的下标。 
	{
		if(c1[b]!=' ')
		{
			c=b;
			break;
		}
	}
	for(b=a-1;b>=0;b--)//排除后面词中的所有空格,记录最后一个字母出现的下标。 
	{
		if(c1[b]!=' ')
		{
			d=b;
			break;
		}
	}
	for(b=d;b>=c;b--)//开始反转单词 
	{
		if(b==c)//因为已经排除了所有空格,所以b=c为字母,无法进行下列条件中,故需要
		//多加条件让其反转 
		{
			for(int m=c;m<=d;m++)
			{
					if(c1[m]==' ')//当遇到空格,说明已经结束,退出循环 
				{
					break;
				}
				printf("%c",c1[m]);
			}
		}
		if(c1[b]==' ')//当为空格时,说明已经过了一个单词。 
		{
			for(int n=b+1;n<=d;n++)//开始将单词反转 
			{
				if(c1[n]==' ')//当遇到空格时,说明已经结束,就退出循环 
				break;
				printf("%c",c1[n]);
			}
				if(c1[b-1]!=' ')//如果2个单词只有一个空格时,就输出空格来间隔 
		{
			printf(" ");
		}
		}
	}
} 

样例:

7-32 说反话-加强版_第2张图片

你可能感兴趣的:(c语言,字符串)