笔试题目
//写一个函数,将字符串翻转,翻转方式如下:“I am a student”反转成“student a am I”,不借助任何库函数。
据说这题在笔试或者面试当中,出现的频率非常高。刚好在书上也看到这题,又在博客园看到这题出现了(“发职位经典面试题”)。
作者也提示了,方法是先反转整个字符串,然后再反转字串。譬如先将“I am a student”反转为“tneduts a ma I”,然后再对每个字串(空格分割)反转一次。思想就那么简单吧。实现起来的话,我就有点凌乱了。C++没学好。伤不起。
算法
#include <stdio.h>
void main()
{
char str[]="I am a student";
printf(str);
printf("\n");
char *p,*q;
char temp;
p=q=str;14 while(*q!='\0')
{
q++;
}
q--;
while(p<=q)
{
temp=*p;
*p=*q;
*q=temp;
p++;
q--;
}//反转整个字符串
printf(str);
printf("\n");
q=str;//指针指向开始位置
char *s,*t;
s=t=str;
while(*q!='\0')
{
if(*q==' ')
{
t--;
while(s<=t)
{
temp=*t;
*t=*s;
*s=temp;
s++;
t--;
}//反转局部字符串
s=q+1;
t=q;
}52 q++;
t++;
}
printf(str);
printf("\n");
}
改进
运行之后,我发现是成功的。
但是怎么想都感觉有点问题,把“I am a student”换成“you are a student”果然有问题。
没有处理最后一个字串的缘故。因为我是按照
if(*q==' ')
来处理字串的,而字符串最后一个的结尾没有空格了,而是以'\0'结尾的。
最后一个字串的处理我是这样做的。
if(*q==' '||*(q+1)=='\0')
{
t--;
if(*(q+1)=='\0')//处理最后一个字串
t++;
看上去有点奇怪吧,但是确实是可以了。
代码貌似可以继续优化吧。怎么都感觉自己写的代码好烂。
代码
以下是完整代码
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
另外给一个我在《程序员面试宝典》看到的代码,不过这个主要采用数组处理,而且使用了库函数(strlen()),但是思想差不多吧。可以参考参考。
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
既然看到了,就应该要思考吧。仅提升..