给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。
输出格式:每个测试用例的输出占一行,输出倒序后的句子。
输入样例:Hello World Here I Come输出样例:
Come I Here World Hello
解题思路:
1、先把整个句子翻转一遍得到olleH dlroW ereH emoC
2、再遍历一遍句子,遇到空格,就把单词再翻转一次。例如:遇到第一个空格前面的单词为olleH,那么就把整个单词翻转为Hello
代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
using namespace std;
#define MAX_STR_LENS 81
/* 进行收尾的反转 */
void reserve(char* str, const int begins, const int ends)
{
int i = 0;
char tmpch = 0;;
int len = (begins + ends) / 2;
int sum = begins + ends;
if (ends <= 0 || begins >= strlen(str) - 1)
{
return;
}
for(i = begins; i <= len; i++)
{
tmpch = str[i];
str[i] = str[sum - i];
str[sum - i] = tmpch;
}
}
int main()
{
char str[MAX_STR_LENS] = {" "};
int i = 0, begs = 0, ends = 0;
gets(str);
/* 先全部反转一遍 */
reserve(str,0,strlen(str) - 1);
for(i = 0; str[i] != '\0'; i++)
{
/* 遇到空格就是一个单词 */
if (str[i] == ' ')
{
ends = i - 1;
reserve(str,begs,ends);
begs = i + 1;
}
}
/* 反转最后一个单词 */
reserve(str,begs,strlen(str) - 1);
cout << str << endl;
}