zoukankan      html  css  js  c++  java
  • 笔试题目“翻转字符串”的实现

    笔试题目

    //写一个函数,将字符串翻转,翻转方式如下:“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;
    }
     
    按 Ctrl+C 复制代码

    既然看到了,就应该要思考吧。仅提升..

    参考
    《程序员面试宝典(第二版)》
    开发职位经典面试题 http://www.cnblogs.com/zhangjing230/archive/2012/05/17/2505711.html
  • 相关阅读:
    40个免费flash相册程序
    Web前端技术趋势:HTML5仍不宜用作生产
    推荐25个提高网站可用性和转化率的工具
    14个可以节省你时间的CSS工具
    12个便于web设计及开发的在线工具
    推荐30个国外的精美字体下载网站
    分享10个色彩绚丽的网站
    2010最值得关注的10款小众互联网产品
    Spring RSocket:基于服务注册发现的 RSocket 负载均衡
    在游戏运营行业,Serverless 如何解决数据采集分析痛点?
  • 原文地址:https://www.cnblogs.com/xzzzh/p/6436234.html
Copyright © 2011-2022 走看看