笔试题目
//写一个函数,将字符串翻转,翻转方式如下:“I am a student”反转成“student a am I”,不借助任何库函数。
据说这题在笔试或者面试当中,出现的频率非常高。刚好在书上也看到这题,又在博客园看到这题出现了(“发职位经典面试题”)。
作者也提示了,方法是先反转整个字符串,然后再反转字串。譬如先将“I am a student”反转为“tneduts a ma I”,然后再对每个字串(空格分割)反转一次。思想就那么简单吧。实现起来的话,我就有点凌乱了。C++没学好。伤不起。
算法
1 #include <stdio.h>
2
3 void main()
4 {
5 char str[]="I am a student";
7 printf(str);
8 printf("
");
9
10 char *p,*q;
11 char temp;
12 p=q=str;14 while(*q!=' ')
15 {
16 q++;
17 }
18 q--;
19 while(p<=q)
20 {
21 temp=*p;
22 *p=*q;
23 *q=temp;
24 p++;
25 q--;
26 }//反转整个字符串
27
28 printf(str);
29 printf("
");
30
31 q=str;//指针指向开始位置
32 char *s,*t;
33 s=t=str;
34 while(*q!=' ')
35 {
36 if(*q==' ')
37 {
38 t--;
39 while(s<=t)
40 {
41 temp=*t;
42 *t=*s;
43 *s=temp;
44 s++;
45 t--;
46 }//反转局部字符串
47
48 s=q+1;
49 t=q;
50 }52 q++;
53 t++;
54 }
55
56 printf(str);
57 printf("
");
58 }
改进
运行之后,我发现是成功的。

但是怎么想都感觉有点问题,把“I am a student”换成“you are a student”果然有问题。

没有处理最后一个字串的缘故。因为我是按照
if(*q==' ')
来处理字串的,而字符串最后一个的结尾没有空格了,而是以' '结尾的。
最后一个字串的处理我是这样做的。
if(*q==' '||*(q+1)==' ')
{
t--;
if(*(q+1)==' ')//处理最后一个字串
t++;
看上去有点奇怪吧,但是确实是可以了。

代码貌似可以继续优化吧。怎么都感觉自己写的代码好烂。
代码
以下是完整代码
#include <stdio.h>
void 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("
");
}
另外给一个我在《程序员面试宝典》看到的代码,不过这个主要采用数组处理,而且使用了库函数(strlen()),但是思想差不多吧。可以参考参考。
《程序员面试宝典》实现方法按 Ctrl+C 复制代码
<gr_block p="0,884">#include <iostram>
#include <stdio.h>
int main(void)
{
int num=-12345,j=0,i=0,flag=0,begin,end;
char str[]="I am a student",temp;
j=strlen(str)-1;
printf(" string=%s ",str);
//第一步是进行全盘反转,将单词变成“tneduts a ma I”
while(j>i)
{
temp=str[i];
str[i]=str[j];
str[j]=temp;
j--;
i++;
}
printf(" string=%s ",str);
int i=0;
//第二步进行部分反转,如果不是空格则开始反转单词
while(str[i])
{
if(str[i]!=' ')
{
begin=i;
while(str[i]&&str[i]!=' ')
{
i++;
}
i=i-1;
end=i;
}
while(end>begin)
{
temp=str[begin];
str[begin]=str[end];
str[end]=temp;
end--;
begin++;
}
i++;
}
printf(" string=%s ",str);
return 0;
}
#include <stdio.h>
int main(void)
{
int num=-12345,j=0,i=0,flag=0,begin,end;
char str[]="I am a student",temp;
j=strlen(str)-1;
printf(" string=%s ",str);
//第一步是进行全盘反转,将单词变成“tneduts a ma I”
while(j>i)
{
temp=str[i];
str[i]=str[j];
str[j]=temp;
j--;
i++;
}
printf(" string=%s ",str);
int i=0;
//第二步进行部分反转,如果不是空格则开始反转单词
while(str[i])
{
if(str[i]!=' ')
{
begin=i;
while(str[i]&&str[i]!=' ')
{
i++;
}
i=i-1;
end=i;
}
while(end>begin)
{
temp=str[begin];
str[begin]=str[end];
str[end]=temp;
end--;
begin++;
}
i++;
}
printf(" string=%s ",str);
return 0;
}
按 Ctrl+C 复制代码
既然看到了,就应该要思考吧。仅提升..
参考《程序员面试宝典(第二版)》开发职位经典面试题 http://www.cnblogs.com/zhangjing230/archive/2012/05/17/2505711.html