劍指Offer 面試題42 反轉單詞順序

2021-06-25 13:52:36 字數 1611 閱讀 1677

/*

反轉單詞順序:

輸入乙個英文句子,反轉句子中單詞的順序,但單詞內字元的順序不變,為了簡單起見,標點符號和普通字母

一樣處理。例如輸入字串"i am a student.",則輸出"student. a am i"。

思路:首先將整個字串完全反轉,然後對單個單詞利用空格做切分後反轉

輸入:每個測試案例為一行,表示一句英文句子。

我們保證乙個句子的單詞數不會超過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

*//*

關鍵:1 首先將整個字串完全反轉,然後對單個單詞利用空格做切分後反轉

2 while(*pend != '\0')

--pend;//注意這裡必須要用pend指向最後乙個字元,因此需要減減

3 pbeg = pend = str;//注意,這裡用給pbeg和pend重新賦值,否則沿用上次計算的值就會出錯

4 if(*pbeg == ' ')//如果遇到空格,就令起點指標和末尾指標,均開始累加

5 else if(*pend == ' ' || *pend == '\0')//如果末尾指標走到下乙個空白處或者字元末尾,那麼,就可以反轉單詞了

*/#include #include const int maxsize = 1e4 + 1;

void reversestr(char* sbeg,char* send)

char ch;

while(sbeg < send)//交換兩個字元,注意這裡是sbeg < send,而不是sbeg != send }

char* reversesentence(char* str)

--pend;//注意這裡必須要用pend指向最後乙個字元,因此需要減減

//反轉整個句子

reversestr(pbeg,pend);

pbeg = pend = str;//注意,這裡用給pbeg和pend重新賦值,否則沿用上次計算的值就會出錯

//printf("%s\n",str);

while(*pbeg != '\0')//開始對每個句子中的每個單詞進行反轉

else if(*pend == ' ' || *pend == '\0')//如果末尾指標走到下乙個空白處或者字元末尾,那麼,就可以反轉單詞了

else//其餘普通情況,只需要累加末尾指標

}return str;

}//注意:反轉整個句子,我們的思路是找到當前空白字元的下乙個字元,以及下乙個空白字元的前乙個字元,然後

//把這段進行反轉

void process()

}int main(int argc,char* argv)

(劍指offer)面試題42 接雨水

給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的高度圖,在這種情況下,可以接 6 個單位的雨水 藍色部分表示雨水 感謝 marcos 貢獻此圖。對於陣列中的每個元素,我們找到的下雨後...

劍指offer 面試題16 反轉鍊錶

題目描述 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。hint 請務必使用鍊錶 輸入 輸入可能包含多個測試樣例,輸入以eof結束。對於每個測試案例,輸入的第一行為乙個整數n 0 n 1000 代表將要輸入的鍊錶的個數。輸入的第二行包含n個整數t 0 t 1000000 代表鍊錶元素。輸出 對應每個...

劍指Offer面試題16 反轉鍊錶

反轉鍊錶 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出翻轉後鍊錶的頭結點。分析 假設h,i,j三個節點。h節點已經指向前面的節點,i節點要指向h節點,這時,i與j中間斷開,因此在將i節點指向 h節點之前,先記下j節點。因此調整時 需要知道當前節點以及當前節點前面乙個節點,以及當前節點後面乙個...