编程珠玑中的一个方法。
移动字符串ABCD EFG 变为 EFG ABCD,可以看成是一个字符串的翻转问题。
ABCD为 x, EFG为y, 翻转x后得到DCBA,翻转y后得到GFE,那么翻转DCBAGFE得到EFGABCD。
另面试题:写一个函数,将字符串翻转,翻转方式如下:“I am a student”反转成“student a am I”,不借助任何库函数。
#include <stdio.h>
int main()
{
char str[]="you are a student";
printf(str);
printf("
");
char *p,*q;
char temp;
p=q=str;
while(*q!=' ')
{
q++;
}
q--;
while(p<=q)
{
temp=*p;
*p=*q;
*q=temp;
p++;
q--;
}//反转整个字符串
printf(str);
printf("
");
char *s;
q=p=s=str;//指针指向开始位置
while(*q!=' ')
{
if(*q==' '||*(q+1)==' ')
{
p--;
if(*(q+1)==' ')//处理最后一个字串
p++;
while(s<=p)
{
temp=*p;
*p=*s;
*s=temp;
s++;
p--;
}//反转局部字符串
s=q+1;
p=q;
}
q++;
p++;
}
printf(str);
printf("
");
}
一、首先翻转整体,然后翻转局部,局部被翻转两次,又顺序回来。
二、其实先翻转局部和先翻转整体是一样的。只要保证局部被翻转两次,就可以又得到顺序。
如上代码将整体和局部翻转的代码换个位置,一样可以得到正确结果。
#include <stdio.h>
int main()
{
char str[]="you are a student";
printf(str);
printf("
");
char *s;
char *p,*q;
char temp;
q=p=s=str;//指针指向开始位置
while(*q!=' ')
{
if(*q==' '||*(q+1)==' ')
{
p--;
if(*(q+1)==' ')//处理最后一个字串
p++;
while(s<=p)
{
temp=*p;
*p=*s;
*s=temp;
s++;
p--;
}//反转局部字符串
s=q+1;
p=q;
}
q++;
p++;
}
printf(str);
printf("
");
p=q=str;
while(*q!=' ')
{
q++;
}
q--;
while(p<=q)
{
temp=*p;
*p=*q;
*q=temp;
p++;
q--;
}//反转整个字符串
printf(str);
printf("
");
}