劍指Offer之翻轉單詞順序
- 題目描述:
- 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
【解析】
/********************************* * 日期:2013-11-29 * 作者:SJF0115 * 題號: 題目1361:翻轉單詞順序 * 來源:https://ac.jobdu.com/problem.php?pid=1361 * 結果:AC * 來源:劍指Offer * 總結: **********************************/ #include <stdio.h> #include <malloc.h> #include <string.h> char *words; //反轉單詞 void ReverseWord(char* words,int begin,int end){ int temp; if(words == NULL || begin > end || begin < 0){ return; } //反轉 while(begin < end){ temp = words[begin]; words[begin] = words[end]; words[end] = temp; begin ++; end --; } } char* Reverse(char *words){ int i; if(words == NULL){ return NULL; } int len = strlen(words); //反轉整個句子 ReverseWord(words,0,len-1); //逐個反轉單詞 int begin = 0,end = 0,isFirst = 0;//begin 單詞第一個字母下標 end 單詞最後一個字母下標isFirst 判斷是不是單詞後第一個空格 for(i = 0;i <= len;i++){ //空格 if(isFirst == 0 && words[i] == ' '){ begin = end = i+1; } //單詞後第一個空格或者一個句子的結束 else if((isFirst == 1 && words[i] == ' ')|| words[i] == '\0'){ ReverseWord(words,begin,end); begin = end = i+1; isFirst = 0; } //單詞 else{ end = i; isFirst = 1; } } return words; } int main() { int i,n; words = (char*)malloc(sizeof(char)*50001); while(gets(words)){ words = Reverse(words); for(i = 0;i < strlen(words);i++){ printf("%c",words[i]); } printf("\n"); }//while return 0; }
最後更新:2017-04-03 14:54:38