亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 4197 | 回復(fù): 10
打印 上一主題 下一主題

[C] 請教一道面試題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-09-16 09:04 |只看該作者 |倒序?yàn)g覽
10可用積分
最近去應(yīng)聘嵌入式開發(fā),發(fā)現(xiàn)有一道題,基本每一個公司都會考
題目如下:
從一個給定的字符串,例如Student is study,中去掉給定的字符串,例如senu,最后得到的結(jié)果是
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;
}
但面試的都說這種算法用在嵌入式系統(tǒng)中效率太差,因?yàn)槲抑皬臎]有做過嵌入式系統(tǒng)開發(fā),所以對效率問題不是那么敏感,請諸位指教應(yīng)該怎么實(shí)現(xiàn)好一些

最佳答案

查看完整內(nèi)容

你自己的程序修正這種題如果將效率那就空間換時間吧,hash的思路,O(1)查找單個字母.思路大致如下,僅僅是思路,希望大家別拍磚!!!不考慮大小寫,刪除的是a-z

論壇徽章:
0
2 [報告]
發(fā)表于 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. }
復(fù)制代碼


這種題如果將效率那就空間換時間吧,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. }
復(fù)制代碼

論壇徽章:
0
3 [報告]
發(fā)表于 2009-09-16 09:16 |只看該作者
1:ResultStr沒有申請空間,也沒有指到某一內(nèi)存區(qū).
2:其實(shí)沒有必要申請空間,假如SrcStr很大的話,浪費(fèi)很大空間,嵌入式系統(tǒng)資源有限,能不申請空間盡量別申請。
3:你上面的程序是錯誤的。SrcStr指針始終沒有變化。
4:面試官說的效率問題可能是指 同一個字符x出現(xiàn)在源字符串中n次你的算法就要查找n次字符x。
5: strchr的原型是:char *strchr(const char *s, int c);

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

論壇徽章:
0
4 [報告]
發(fā)表于 2009-09-16 10:02 |只看該作者
原帖由 moonwhite999 于 2009-9-16 09:04 發(fā)表
最近去應(yīng)聘嵌入式開發(fā),發(fā)現(xiàn)有一道題,基本每一個公司都會考
題目如下:
從一個給定的字符串,例如Student is study,中去掉給定的字符串,例如senu,最后得到的結(jié)果是
tdnt i tdy

我是這樣做的
char * De ...

問題有點(diǎn)多哦

論壇徽章:
0
5 [報告]
發(fā)表于 2009-09-16 11:43 |只看該作者
正則表達(dá)式呀。。

如果目標(biāo)平臺沒有正則的庫,移植個好了,pcre...哈哈

論壇徽章:
0
6 [報告]
發(fā)表于 2009-09-16 13:04 |只看該作者
嵌入式哪有靠算法效率的?這不是扯么?

論壇徽章:
0
7 [報告]
發(fā)表于 2009-09-16 14:52 |只看該作者

回復(fù) #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 [報告]
發(fā)表于 2009-09-16 15:11 |只看該作者
char *ResultStr=new char[strlen(SrcStr)+1];


假如SrcStr很大的話,有點(diǎn)浪費(fèi)空間.嵌入式嘛,能不浪費(fèi)空間就最好別浪費(fèi)。

論壇徽章:
0
9 [報告]
發(fā)表于 2009-09-16 17:46 |只看該作者
思路就是空間換時間。用一個26字節(jié)的數(shù)組c來記錄哪些字母需要替換,然后掃描整個字符串,用其ascii碼-'a'或'A'來做下標(biāo)去查看是否需要替換。

  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. }
復(fù)制代碼

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

論壇徽章:
0
10 [報告]
發(fā)表于 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;
}


試試上面的代碼,我看可以滿足你的要求。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP