612
技術社區[雲棲]
劍指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