1. 程式人生 > >劍指offer42:翻轉單詞順序

劍指offer42:翻轉單詞順序

題目描述:
JOBDU最近來了一個新員工Fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事Cat對Fish寫的內容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。例如,“student. a am I”。後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是“I am a student.”。Cat對一一的翻轉這些單詞順序可不在行,你能幫助他麼?
輸入:
每個測試案例為一行,表示一句英文句子。 我們保證一個句子的單詞數不會超過600,每個單詞的長度也不會超過30。但是需要注意的是Fish是個不拘小節的人,有時候兩個單詞中間可能會有很多空格。為了方便起見,你可以認為一行的字元總數不會超過50000個,標點符號可以和普通字母一樣處理。
輸出:
對應每個測試案例,把翻轉後的正確的句子單獨輸出一行。
樣例輸入:
student. a am I
I'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