剑指offer42:翻转单词顺序

来源:互联网 发布:ck背包 知乎 编辑:程序博客网 时间:2024/04/29 07:59

题目描述:
JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
输入:
每个测试案例为一行,表示一句英文句子。
我们保证一个句子的单词数不会超过600,每个单词的长度也不会超过30。但是需要注意的是Fish是个不拘小节的人,有时候两个单词中间可能会有很多空格。为了方便起见,你可以认为一行的字符总数不会超过50000个,标点符号可以和普通字母一样处理。
输出:
对应每个测试案例,把翻转后的正确的句子单独输出一行。
样例输入:
student. a am II'm a Freshman and I like JOBDU!
样例输出:
I am a student.JOBDU! like I and Freshman a I'm

示例代码如下:

#ifndef PROGRAM42_H#define PROGRAM42_H#include <iostream>#include <string.h>void ReverseWord(char* start,char* end){if(start==NULL || end==NULL)return;while(start<end){char temp;temp=*start;*start=*end;*end=temp;--end;++start;}}void ReverseString(char* str){if(str==NULL)return;char *pstr=str;char *start=NULL,*end=NULL;while(*pstr!='\0'){while(*pstr!='\0' && *pstr==' ')++pstr;start=pstr;//单词的开始while(*pstr!='\0' && *pstr!=' ')++pstr;end=pstr-1;//单词的结尾ReverseWord(start,end);}}void TestProgram42(){char str[18000];while(std::cin.getline(str,18000)){char *start=str;char *end=str+strlen(str)-1;ReverseWord(start,end);ReverseString(str);std::cout<<str<<std::endl;}}#endif

0 0
原创粉丝点击