给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
思路:
一开始的思路是先用二维数组单独提取每个单词,因为有中间多个空格的情况。提取成功后再局部逆置加总体逆置的方法实现。代码是这样的:
#include<stdio.h>
#include<string.h>
int main(void)
{
//通过空格提取词语
//输入
char str[100][500001];
int i = -1;
int j = -1;
int k = 0;
char ch;
while((ch = getchar()) != '\0')
{
if((ch < 97) && (ch > 32)) //该字为大写字母且不是空格,小于97为大写,大于32为空格
{
i++;
j++;
str[i][j] = ch;
}
if(ch != ' ') //小写字母的情况
{
j++;
str[i][j] = ch;
}
j = -1;
}
//输出测试
for(k = 0; k < i; k++)
printf("%s ", str[i]);
printf("\n");
return 0;
}
但是,编译的时候一直有段错误,静态调试的时候认为逻辑上并没有什么问题,但是一直编译都不能成功,后来看到这篇觉得用队列的思想解决才是最高效的。
代码如下:
#include<stdio.h>
#include<string.h>
int main(void)
{
char str[500001];
int i = 0;
int j = 0;
int k = 0;
int rear = 0;
int front = 0;
int count = 0;
int len = 0;
gets(str);
len = strlen(str);
for(i = len - 1; i >= 0; i--)//逆向遍历
{
if(str[i] != ' ')
{
rear = i;//指向当前单词的最后一个字母
for(j = i - 1; j >= 0; j--)
{
if(str[j] == ' ')
{
break;
}
}
front = j + 1;//指向当前单词的第一个字母
if(count > 0)
{
printf(" ");
}
for(k = front; k <= rear; k++)
{
printf("%c", str[k]);
}
count++;
i = j;
}
}
return 0;
}