【我解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;
}
以单词为单位的翻转字符串
原题: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;
}
相关文章推荐
- 【我解C语言面试题系列】013 以单词为单位的翻转字符串
- C/C++面试之算法系列--以单词为最小单位翻转字符串
- 剑指Offer系列-面试题42:翻转单词顺序和左旋转字符串
- 面试题42:翻转单词顺序 VS 左旋转字符串
- 剑指Offer面试题42:翻转单词顺序;左旋转字符串 Java实现
- 实现以单词为单位的翻转字符串
- 剑指offer 面试题42 翻转单词顺序 VS 左旋转字符串
- 剑指offer-面试题42-翻转单词顺序VS左旋转字符串
- 【剑指offer】面试题42-翻转单词顺序VS左旋转字符串
- 【剑指offer】面试题42:单词翻转顺序&左右旋转字符串
- 剑指Offer面试题41和为s的两个数字与和为s的连续正数序列,面试题42翻转单词顺序与左旋转字符串
- 【我解C语言面试题系列】010 从相应位置开始删除指定字符串的相应个字符
- 面试题:编程实现将字符串的各个单词翻转
- 【面试题042】翻转单词顺序VS左旋转字符串
- 剑指offer-面试题42:翻转单词顺序VS左旋转字符串
- 按单词翻转字符串 C语言实现
- 剑指offer面试题 翻转单词顺序 VS 左旋转字符串
- 剑指offer--面试题42: 翻转单词顺序列 vs 左旋转字符串
- 【我解C语言面试题系列】010 从相应位置开始删除指定字符串的相应个字符
- 以单词为单位对字符串进行翻转(用C#编写,但不用其中的库函数)