原題:
? 以單詞為最小單位翻轉字符串
? Write the function String reverseStringWordByWord(String input) that reverses
? a string word by word.? For instance,
? reverseStringWordByWord("The house is blue") --> "blue is house The"
? reverseStringWordByWord("Zed is dead") --> "dead is Zed"
? reverseStringWordByWord("All-in-one") --> "All-in-one"
面試系列4種的實現,比較費空間,因為多申請了一段空間來保存結果。
在看了其他高手的實現后,發現可以不用申請空間,并且循環的次數更少,也可以實現相同的效果。
大體思路是:
原字符串: The house is blue
先翻轉整個字符串-> eulb si esuoh ehT
再翻轉單個單詞。
代碼:
/********************************************************************
??? created:??? 2006/06/16
??? filename:?? C:\Documents and Settings\Administrator\桌面\flwo\reverse2.c
??? file path:? C:\Documents and Settings\Administrator\桌面\flwo
??? file base:? reverse
??? file ext:?? c
??? author:???? A.TNG
??? version:??? 0.0.1
???
??? purpose:??? 以單詞為最小單位翻轉字符串-2 優化版
??????????????? Write the function String reverseStringWordByWord(String input)
??????????????? that reverses a string word by word.? For instance,
??????????????? reverseStringWordByWord("The house is blue") --> "blue is house The"
??????????????? reverseStringWordByWord("Zed is dead") --> "dead is Zed"
??????????????? reverseStringWordByWord("All-in-one") --> "All-in-one"
??????????????? 參考其他高手的思路:
??????????????? 先翻轉整個字符串-> eulb si esuoh ehT
??????????????? 再翻轉單個單詞。
*********************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define REVERSE_WORD(p1, p2) while (p1 <= p2) \
??? { \
??????? char ch; \
??????? ch = *p1; *p1 = *p2; *p2 = ch; \
??????? p1++; p2--; \
??? }
/*
?*? name: reverse_src_word_by_word
?*? params:
?*??? des?????????? [out]?????????? 輸出字符串, des 指向實現申請的空間
?*??? src?????????? [in]??????????? 輸入字符串,需要處理的字符串
?*? return:
?*??? 處理完成后的 des 指針
?*? notes:
?*??? 以單詞為最下單位翻轉字符串
?*??? 優化: 先翻轉整個字符串,再翻轉單個單詞
?*?
?*? author: A.TNG 2006/06/16 10:37
?*/
char * reverse_str_word_by_word2(char *src)
{
??? char?? *p1, *p2;
??? int???? n_src_len;
??? if (NULL == src)
??????? return NULL;
??? /* 先把整個字符串翻轉一次 */
??? n_src_len = strlen(src);
??? p1 = src; p2 = src + n_src_len - 1;
??? REVERSE_WORD(p1, p2);
#if 0
??? while (p1 <= p2)
??? {
??????? /* 交換頭字符和尾字符 */
??????? char ch;
??????? ch = *p1; *p1 = *p2; *p2 = ch;
??????? p1++; p2--;
??? }
#endif
??? /* 再翻轉單個單詞 */
??? p1 = src; p2 = p1;
??? while ('\0' != *p2)
??? {
??????? if (' ' == *p2)
??????? {
??????????? char?? *p;
??????????? p = p2 - 1;
??????????? REVERSE_WORD(p1, p);
#if 0??????????
??????????? while (p1 <= p)
??????????? {
??????????????? char ch;
??????????????? ch = *p1; *p1 = *p; *p = ch;
??????????????? p1++; p--;
??????????? }
#endif
??????????? p2++;
??????????? p1 = p2;
??????? }
??????? else
??????? {
??????????? p2++;
??????? }
??? }
??? /* 翻轉最后一個單詞 */
??? p2--;
??? REVERSE_WORD(p1, p2);
#if 0
??? while (p1 <= p2)
??? {
??????? char ch;
??????? ch = *p1; *p1 = *p2; *p2 = ch;
??????? p1++; p2--;
??? }
#endif
??? return src;
}
/*
?*? name: main
?*? params:
?*??? none
?*? return:
?*??? none
?*? notes:
?*??? none
?*?
?*? author: A.TNG 2006/06/16 10:37
?*/
int main()
{
??? // char src[] = " All-in-one ";
??? // char src[] = "The house is blue";
??? char??? src[]?? = "Zed is dead";
??? (void) reverse_str_word_by_word2(src);
??? printf("*****%s*****\n", src);
??? system("PAUSE");
}