Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1411831
  • 博文数量: 143
  • 博客积分: 10005
  • 博客等级: 上将
  • 技术积分: 1535
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-23 17:25
个人简介

淡泊明志 宁静致远

文章分类

全部博文(143)

文章存档

2011年(2)

2009年(1)

2007年(22)

2006年(118)

我的朋友

分类: C/C++

2007-07-20 12:23:07

【我解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

 

#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;

}

阅读(5393) | 评论(6) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-06-27 10:30:07

感觉你这个有复杂, void main() { char a[]="i come from beijing." int i,j,k=0; for(i=strlen(a);i>=0;i--) { k++; if((a[i]!=' ')&&(i!=0)) continue; for(j=i;j<=k+i;j++) printf("%c",a[j]); } k=0; }

chinaunix网友2009-12-09 13:18:33

while( !IS_PRINT(*right) ) right++; 过滤掉不能显示的字符

chinaunix网友2009-02-26 22:09:02

为什么我执行没有结果出来呢,调试没有错误,但是不会出现结果,什么原因能解释一下吗?谢谢!

chinaunix网友2008-11-04 15:04:42

while( !IS_PRINT(*right) ) right++; 这什么意思?不是死循环吗?