原題:
? 以單詞為最小單位翻轉(zhuǎn)字符串
? 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種的實(shí)現(xiàn),比較費(fèi)空間,因?yàn)槎嗌暾?qǐng)了一段空間來(lái)保存結(jié)果。
在看了其他高手的實(shí)現(xiàn)后,發(fā)現(xiàn)可以不用申請(qǐng)空間,并且循環(huán)的次數(shù)更少,也可以實(shí)現(xiàn)相同的效果。
大體思路是:
原字符串: The house is blue
先翻轉(zhuǎn)整個(gè)字符串-> eulb si esuoh ehT
再翻轉(zhuǎn)單個(gè)單詞。
代碼:
/********************************************************************
??? 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:??? 以單詞為最小單位翻轉(zhuǎn)字符串-2 優(yōu)化版
??????????????? 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"
??????????????? 參考其他高手的思路:
??????????????? 先翻轉(zhuǎn)整個(gè)字符串-> eulb si esuoh ehT
??????????????? 再翻轉(zhuǎn)單個(gè)單詞。
*********************************************************************/
#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 指向?qū)崿F(xiàn)申請(qǐng)的空間
?*??? src?????????? [in]??????????? 輸入字符串,需要處理的字符串
?*? return:
?*??? 處理完成后的 des 指針
?*? notes:
?*??? 以單詞為最下單位翻轉(zhuǎn)字符串
?*??? 優(yōu)化: 先翻轉(zhuǎn)整個(gè)字符串,再翻轉(zhuǎn)單個(gè)單詞
?*?
?*? 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;
??? /* 先把整個(gè)字符串翻轉(zhuǎn)一次 */
??? 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
??? /* 再翻轉(zhuǎn)單個(gè)單詞 */
??? 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++;
??????? }
??? }
??? /* 翻轉(zhuǎn)最后一個(gè)單詞 */
??? 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");
}