免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4025 | 回复: 10
打印 上一主题 下一主题

[C] 请教一道面试题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-16 09:04 |只看该作者 |倒序浏览
10可用积分
最近去应聘嵌入式开发,发现有一道题,基本每一个公司都会考
题目如下:
从一个给定的字符串,例如Student is study,中去掉给定的字符串,例如senu,最后得到的结果是
tdnt i tdy

我是这样做的
char * DeleteStr(char *SrcStr,char *ReplaceStr)
{

        char * ResultStr;
        int n = strlen(SrcStr);
        int j=0;
        for(int i = 0;i<n;i++)
        {
               if(strchr(ReplaceStr,SrcStr)==0)
               {
                     ResultStr[j++] = SrcStr;
                }
         }
         return ResultStr;
}
但面试的都说这种算法用在嵌入式系统中效率太差,因为我之前从没有做过嵌入式系统开发,所以对效率问题不是那么敏感,请诸位指教应该怎么实现好一些

最佳答案

查看完整内容

你自己的程序修正这种题如果将效率那就空间换时间吧,hash的思路,O(1)查找单个字母.思路大致如下,仅仅是思路,希望大家别拍砖!!!不考虑大小写,删除的是a-z

论坛徽章:
0
2 [报告]
发表于 2009-09-16 09:04 |只看该作者
你自己的程序修正


  1. char* DeleteStr1(char *SrcStr,char *ReplaceStr)
  2. {
  3.   int n = strlen(SrcStr);
  4.   int j = 0;
  5.   int i = 0;
  6.   char* ResultStr = SrcStr;

  7.   for(i = 0;i<n;i++)
  8.    {
  9.      if(strchr(ReplaceStr,SrcStr[i])==0)
  10.       {
  11.        ResultStr[j++] = SrcStr[i];
  12.       }
  13.    }
  14.    ResultStr[j]='\0';
  15.    return ResultStr;
  16. }
复制代码


这种题如果将效率那就空间换时间吧,hash的思路,O(1)查找单个字母.思路大致如下,仅仅是思路,希望大家别拍砖!!!
不考虑大小写,删除的是a-z



  1. char* DeleteStr2(char *SrcStr,char *ReplaceStr)
  2. {
  3.   int j = 0;
  4.   int i = 0;
  5.   char* ResultStr = SrcStr;
  6.   int A[26];
  7.   
  8.   for(i=0;i<26;i++)
  9.     A[i]=0;
  10.   
  11.   i=0;  
  12.   while(ReplaceStr[i]!='\0')
  13.    {
  14.      A[ReplaceStr[i]-'a']=1;
  15.      i++;
  16.    }
  17.   
  18.   i=0;   
  19.   while(SrcStr[i]!='\0')
  20.    {
  21.      if(SrcStr[i]<'a'||A[SrcStr[i]-'a']==0)
  22.        ResultStr[j++] = SrcStr[i];
  23.      i++;  
  24.    }
  25.    
  26.    ResultStr[j]='\0';
  27.    return ResultStr;
  28. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2009-09-16 09:16 |只看该作者
1:ResultStr没有申请空间,也没有指到某一内存区.
2:其实没有必要申请空间,假如SrcStr很大的话,浪费很大空间,嵌入式系统资源有限,能不申请空间尽量别申请。
3:你上面的程序是错误的。SrcStr指针始终没有变化。
4:面试官说的效率问题可能是指 同一个字符x出现在源字符串中n次你的算法就要查找n次字符x。
5: strchr的原型是:char *strchr(const char *s, int c);

[ 本帖最后由 ajianglaoka 于 2009-9-16 09:26 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-09-16 10:02 |只看该作者
原帖由 moonwhite999 于 2009-9-16 09:04 发表
最近去应聘嵌入式开发,发现有一道题,基本每一个公司都会考
题目如下:
从一个给定的字符串,例如Student is study,中去掉给定的字符串,例如senu,最后得到的结果是
tdnt i tdy

我是这样做的
char * De ...

问题有点多哦

论坛徽章:
0
5 [报告]
发表于 2009-09-16 11:43 |只看该作者
正则表达式呀。。

如果目标平台没有正则的库,移植个好了,pcre...哈哈

论坛徽章:
0
6 [报告]
发表于 2009-09-16 13:04 |只看该作者
嵌入式哪有靠算法效率的?这不是扯么?

论坛徽章:
0
7 [报告]
发表于 2009-09-16 14:52 |只看该作者

回复 #1 moonwhite999 的帖子

char * DeleteStr(char *SrcStr,char *ReplaceStr)
{

        char *ResultStr=new char[strlen(SrcStr)+1];
        int n = strlen(ReplaceStr);
                int nFlag = 0; //Flag为1,则不拷贝

                int j=0,k=0;

                while((*SrcStr) != '\0')
                {
                        nFlag = 0;
                        for(int i=0;i<n;i++)
                        {
                                if(*SrcStr == ReplaceStr)
                                {
                                        nFlag = 1;
                                        break;
                                }
                        }

                        if(1 == nFlag)
                                {SrcStr++;continue;}

                        ResultStr[j] = *SrcStr;
                        j++;
                        SrcStr++;
                }

         return ResultStr;
}


[ 本帖最后由 liklone 于 2009-9-16 14:53 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-09-16 15:11 |只看该作者
char *ResultStr=new char[strlen(SrcStr)+1];


假如SrcStr很大的话,有点浪费空间.嵌入式嘛,能不浪费空间就最好别浪费。

论坛徽章:
0
9 [报告]
发表于 2009-09-16 17:46 |只看该作者
思路就是空间换时间。用一个26字节的数组c来记录哪些字母需要替换,然后扫描整个字符串,用其ascii码-'a'或'A'来做下标去查看是否需要替换。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <malloc.h>

  4. char c[26] = {0};

  5. void setflg(char* str, int len)
  6. {
  7.   for(int i = 0; i < len; i++)
  8.   {
  9.     char idx = (str[i] >= 'A' && str[i] <= 'Z')?(str[i] - 'A'):(str[i] - 'a');
  10.     c[idx] = 1;
  11.   }
  12. }

  13. void compareStr(char* str, int len)
  14. {
  15.   for(int i=0;i < len; i ++)
  16.   {
  17.     char idx = (str[i] >= 'A' && str[i] <= 'Z')?(str[i] - 'A'):(str[i] - 'a');
  18.     if (c[idx] == 1)
  19.     {
  20.        str[i] = '\0';
  21.     }
  22.   }  
  23. }

  24. void trimStr(char* inStr, char* outStr, int len)
  25. {
  26.   int idx = 0;
  27.   for(int i = 0; i < len; i++)
  28.   {
  29.     if(inStr[i] != '\0')
  30.     {
  31.       outStr[idx] = inStr[i];
  32.       idx++;
  33.     }
  34.   }
  35. }

  36. main()
  37. {
  38.   char a1[] = "Student is study";
  39.   char a2[] = "senu";
  40.   int len1 = strlen(a1);
  41.   int len2 = strlen(a2);
  42.   setflg(a2, len2);
  43.   compareStr(a1, len1);
  44.   char* outStr = (char*)malloc(sizeof(a1));
  45.   memset(outStr, 0, sizeof(a1));
  46.   trimStr(a1, outStr, len1);
  47.   printf("%s\n", outStr);
  48.   free(outStr);
  49. }
复制代码

[ 本帖最后由 gz80 于 2009-9-16 17:47 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-09-16 20:22 |只看该作者
char * DeleteStr(char *src,  char *rstr )
{
      char     *p ,
                  *p1;
       p =  p1 = src ;
      while ( *p ){
          if(strchr(rstr,  *p ) == NULL)  *p1 ++ = *p;
          p ++;
      }
      *p1 = 0x00;
      return   src;
}


试试上面的代码,我看可以满足你的要求。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP