您的位置:首页 > 编程语言 > C语言/C++

【我解C语言面试题系列】013 以单词为单位的翻转字符串

2007-07-20 12:23 519 查看
【我解C语言面试题系列】013 以单词为单位的翻转字符串


以单词为单位的翻转字符串
原题:Write a function string reverse string word By word (String input) that reverses a string word by word.
For instance:

"The house is blue" --> "blue is house The"
"Zed is dead" -->"dead is Zed"

"All-in-one" -->"All-in-one"
在不增加任何辅助数组空间的情况下,对于这个问题我们可以采用的办法就是:
办法一
1、翻转整个字符串。
2、翻转每一个单词。
办法二
1、翻转每一个单词。
2、翻转整个字符串。
办法一和二其实就是一个顺序的问题,并不影响算法的时间或空间复杂度。

下面给出代码:【本程序在DEV C++ 4.9.9.2 下编译通过】
#include <stdio.h>

#define IS_PRINT(ch) ( (ch) > 0x20 && (ch) < 0x7E ) // except space

char * ReverseEveryWord(char *str);
char * ReverseWholeString(char * str);
char * LR_Reverse(char *left,char *right);

int main(void)
{
char str[] = "Hello word! **";
char *p = str;
#if 0
ReverseWholeString(str);
ReverseEveryWord(str);
puts(str);
#else
ReverseEveryWord(str);
ReverseWholeString(str);
puts(str);
#endif
system("pause");
return 0;
}
char * ReverseEveryWord(char *str)
{
char *right = str,*left = str;

if(str == NULL)
return NULL;

while( !IS_PRINT(*right) )
right++;
while(*right)
{
left = right;
while(IS_PRINT(*right))
right++;
LR_Reverse(left,right-1);
while(*right && !IS_PRINT(*right))
right++;
}
return str;
}
char * ReverseWholeString(char * str)
{
char *p = str;

if(str == NULL)
return NULL;

while(*p) p++;
p--;

LR_Reverse(str,p);

return str;
}
char * LR_Reverse(char *left,char *right)
{
char tt,*ret = left;

if(left == NULL || right == NULL)
return NULL;

while(left < right)
{
tt = *left;
*left++ = *right;
*right-- = tt;
}
return ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: