鱼C论坛

 找回密码
 立即注册
查看: 7688|回复: 5

求助!全志科技2014招聘的一道笔试题,求解答!

[复制链接]
发表于 2013-9-15 17:57:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
用C实现一个函数,函数原型为:
int strreplace(char *origin,char *target,char *rpl);
要求:把字符串origin中的target字符串全部替换成rpl,最后输出得到的新数组,设定所有的参数字符串长度不超过1024.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-9-15 21:29:22 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<string.h>
  3. int th(char *a,char *b,char *c)
  4. {
  5.         int len1=strlen(a);
  6.         int len2=strlen(b);
  7.         int i,j,k,m,count;
  8.         i=j=0;                                //两字符串游标
  9.         count=0;                        //计数器
  10.         while(i!=len1)
  11.         {
  12.                 j=0;                        //每次循环都从b[0]开始找起
  13.                 count=0;                //重置计数器
  14.                 if(a[i]!=b[j])
  15.                 {
  16.                         i++;
  17.                         continue;
  18.                 }                                //不等则找a中下一个字符
  19.                 else
  20.                 {
  21.                         while(count!=len2)
  22.                         {
  23.                                 if(a[i]==b[j])               
  24.                                 {
  25.                                          i++;
  26.                                          j++;
  27.                                          count++;
  28.                                 }                //如果相同就一直找
  29.                                 else
  30.                                         break;  //不同则退出当前小循环
  31.                         }
  32.                         if(count==len2) //如果计数器等于b长度,则替换
  33.                         {
  34.                                 m=len2-1;
  35.                                 for(k=i-1;k>=(i-count);k--)
  36.                                 {
  37.                                         a[k]=c[m];
  38.                                         m--;
  39.                                 }
  40.                         }
  41.                        
  42.                 }
  43.         }
  44.         printf("%s\n",a);
  45.         return 1;
  46. }
  47. int main()
  48. {
  49.         char a[]="aa1abc1ilovecjabc1xxxaabclovecabc1jababc1";
  50.         char b[]="abc1";
  51.         char c[]="xyz2";
  52.         th(a,b,c);

  53.         return 0;
  54. }

  55.                        
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-16 17:35:13 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-17 07:43:52 | 显示全部楼层
我也来贴下自己的代码,代码写的有点乱,高手飘过。
这个题主要就是方法(可以说是算法)和思路,代码挺简单的,我就不做过多的注释了。有不明白的就问我把:lol:

本人也是小菜鸟,希望大牛能把自己好的思路和代码发上来,一起分享和讨论!

奉上自己凌乱的代码:
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main()
  4. {
  5.       int strreplace(char *origin,char *target,char *rpl);
  6.       char o[1024], t[1024], r[1024];
  7.       int count;                //计算替代的个数
  8.       printf("请输入源字符串:\n");
  9.       scanf("%s", o);
  10.       printf("请输入被替换的字符串:");
  11.       scanf("%s", t);
  12.       printf("请输入需要替换字符串:");
  13.       scanf("%s", r);

  14.       count = strreplace(o, t, r);
  15.       printf("新的字符串为:\n");
  16.       printf("%s\n", o);
  17.       printf("共有:%d处被替换了!\n", count);
  18.       return 0;
  19. }

  20. int strreplace(char *origin,char *target,char *rpl)
  21. {
  22.       int count, i, j, k, len_origin,len_target, len_rpl, local;   // local定位temp中的位置
  23.       char temp[1024];
  24.       
  25.       len_origin = strlen(origin);
  26.       len_target = strlen(target);
  27.       len_rpl = strlen(rpl);
  28.       count = 0;
  29.       local = 0;
  30.       
  31.       if(len_origin < len_target)
  32.       {
  33.             printf("被替换的字符串长度大于原字符串,不能替换!!\n");
  34.             return 0;
  35.       }
  36.       
  37.       i = 0;
  38.       while(origin[i])   
  39.       // 如果最后一个字符相同于target,数组引用是有可能超界,但测试没出错
  40.       {
  41.             for(j = 0; j < len_target; j++)
  42.             {
  43.                   if(origin[i+j] != target[j])
  44.                         break;
  45.             }
  46.             if(len_target != j)     //判断
  47.             {
  48.                   temp[local] = origin[i];   //不相同就复制到temp中
  49.                   local++;
  50.             }
  51.             else
  52.             {
  53.                   for(k = 0; k < len_rpl; k++)
  54.                   {
  55.                         temp[local] = rpl[k];     //将替换内容复制到temp中
  56.                         local++;
  57.                   }
  58.                   count++;
  59.                   i = i + j - 1;                 //i指向替换的最后一个对象
  60.             }
  61.             i++;
  62.       }
  63.       temp[local] = '\0';     // temp最后需要'\0'来结尾
  64.       
  65.       for(i = 0; temp[i]; i++)  // 将temp复制到origin上
  66.       {
  67.             origin[i] = temp[i];
  68.       }
  69.       origin[i] = '\0';       // origin也需要以'\0'结尾,origin后面如果有内容也被忽略

  70.       return count;
  71. }
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-18 22:58:08 | 显示全部楼层
先提供一下思路(只是个人思路)
1、早源字符串里面找到要替换的位置 利用strstr
2、创建临时的buf,把target之前的字符串先拷贝
3、在buf里添加要替换的字符串
4、把去掉target之后的那段也加到buf后面

之后就是循环去找target,循环操作

这个算法没有进行过效率的考究,所以现在只是自我建议
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-18 23:27:52 | 显示全部楼层
  1. #include "stdio.h"

  2. int strreplace(char *origin,char *target,char *rpl)
  3. {
  4.     char* p = NULL;
  5.     char tmpBuf[1024] = {0};
  6.     char outPutBuf[1024] = {0};
  7.     int offset = 0;
  8.     char* tmporigin;

  9.     if (strlen(origin) > 1024)
  10.         return -1;
  11.     if (strlen(target) > 1024)
  12.         return -1;
  13.     if (strlen(rpl) > 1024)
  14.         return -1;

  15.     strcpy(outPutBuf, origin);
  16.     while (1){
  17.         p = strstr(outPutBuf, target);
  18.         if (!p)
  19.             break;
  20.         offset = p - outPutBuf;
  21.         strncpy(tmpBuf, outPutBuf, offset);
  22.         strncpy(tmpBuf + offset, rpl, strlen(rpl));
  23.         strncpy(tmpBuf + offset + strlen(rpl), p + strlen(target), strlen(p + strlen(target)));
  24.         strcpy(outPutBuf, tmpBuf);
  25.     }
  26.     strcpy(origin, outPutBuf);
  27. }
  28. int main()
  29. {
  30.     char a[1024] = "12345678";
  31.     char b[1024] = "56";
  32.     char c[1024] = "000";
  33.     strreplace(a, b, c);
  34.     printf("a = %s\n", a);
  35.     return 0;
  36. }
复制代码
代码如下,已经测试过了, 不过效率肯定不高。


这样的题个人感觉 更好是用链表,因为容易增删
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-6 10:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表