1. 程式人生 > >題目1361:翻轉單詞順序-九度

題目1361:翻轉單詞順序-九度

題目描述:
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

推薦指數:※※

來源:http://ac.jobdu.com/problem.php?pid=1361

這道題是字串逆序,但單詞本身不能被逆序。分為兩步,首先將句本身逆轉。然後在識別出單詞,進行逆轉。

注意空格不需要處理。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
const int N=50001;
void reversal(char *str,int len){
    int i=0,j=len-1;
    while(i<j){
        char tmp=str[i];
        str[i]=str[j];
        str[j]=tmp;
		i++;
		j--;
    }
}
void reversal_sent(char *str,int len){
    reversal(str,len);
    int i=0,j=0;
    while(str[i]!='\0'){
		j=i;
        while(str[j]==' '&&str[j]!='\0')
            j++;
		i=j;
        while(str[i]!=' '&&str[i]!='\0')
            i++;
        reversal(str+j,i-j);
    }
}
int main()
{
    char str[N];
    while(gets(str)){
        reversal_sent(str,strlen(str));
        printf("%s\n",str);
	}
    return 0;
}