说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

快来找BUG(华为试题)!!-csf

编辑:说三道四文库 发布时间:2017-07-21 08:41
HTML文档下载 WORD文档下载 PDF文档下载
实现字符串反序排列。
请问有没有BUG。或者高手拿出巧妙的算法
让华为的瞧瞧!!

char * revers(char *s)
{
int len;
len=strlen(s);
//char *p=new char[len];
char *p=(char *)malloc(sizeof(char)*len);
char *h=p; 
char *t;int l=len-1;
for(t=s+l;l>=0;l--,t=s+l)
{*p=*t;
p++;
}
return h;

}
main()
{
char *s="string";
printf("%s",revers(s));
_getch();

}
这里h是局部变量,它的作用域只在revers函数中
所以当return后,该指针也就随之消失,
所以将得到一个莫名的地址.
打印的也就不知道是什么了.:)
应该在for语句后再加上一条
*p='\0';
这样字符串才能正常结束
打印才能正常:)
我上面的说法好像是错了
不要介意呦:)
t=s+l  ->*t=*s+l
t=s+l ->*t=*s+l
char * revers(char *s)
{
    int len =strlen(s);
    char *p=new char[len + 1];
    for(int i = len;i == 0; i--)
        p[len - i] = s[i];
    p[len + 1] = '\0';
    return p;
    
}
char * revers(char *s)
{
    int len =strlen(s);
    char *p=new char[len + 1];
    for(int i = len;i == 0; i--)
        p[len - i] = s[i];
    p[len + 1] = '\0';
    strcpy(s, p);
    delete p;
    return s;
    
}
应该是 delete []p;
strlen 得到的是字符串实际长度,l = len -1就开始好像有问题了!
strlen 得到的是字符串实际长度,l = len -1就开始好像有问题了!
#include <stdio.h>
#include <string.h>
#include <conio.h>

char * revers(char *s)
{
        int len,index=0;
        len=strlen(s);
        char * p = new char[len];
        while( len - index > 0 )
                *(p+index) = *(s+len-1-index++);
        *(p+len)=0;
        return p;
}

void main()
{
        char *s="string";
        char * rs;
        printf("%s",rs=revers(s));
        getch();
        delete []rs;
}
holyfire(发了财的众神之焰):
你的 p 并没有释放,会不会有问题?
delete []rs;
这不就释放了吗。
请问原试题是在*.c文件上还是*.cpp上。
我的感觉是华为比较喜欢考纯 C 的程式.
我的:


char * revers(char *s)
{
    int len=strlen(s);
    int idMax=len-1;
    len>>=1;
        
    for(int i=0;i<len;i++)
    {
     s[i]^=s[idMax-i];
     s[idMax-i]^=s[i];
     s[i]^=s[idMax-i];
    }     
       
    return s;
    
}
呵呵,正规的应该是:
char*   reverse (char*   s)
{
      char    c;
      char*   begin;
      char*   end;

      begin = end = s;

      while (*end++);

      end --;

      while (end>=begin)
      {
           c = *begin;
           *begin = *end;
           *end = c;
           end --;
           begin ++;
      }

      return s;
}



                华为那这种考题来考你,摆明了就是不打算要你了:)



与其说是有bug,应该说这个程序是错误的更恰当。
第一,strlen返回的字符串长度不包括字符串结束符'\0',所以char *p=(char *)malloc(sizeof(char)*len);应该是sizeof(char)*len+1;
第二,该程序中最大的错误是在函数体中使用malloc函数分配内存,但是没有在函数中释放内存。事实上该程序不需要分配内存,而是使用原来的字符串就可以了。
liuto(b34)写的程序是正确的。

如果要求不改变源字符串则函数的声明应该是
循环次数减少一半

char * revers(char *s)
{
    int i;
    char c;
    int len=strlen(s);

    for (i=0;i<len/2;i++){
        c=s[i];
        s[i]=s[len-i-1];
        s[len-i-1]=c;
    }
   
    return s;
    
}
其实,华为不是一个软件公司。
所以,只好出这样的题
去华为的人将来就一辈子研究这样的问题了,.
别动不动就把华为的试题拿出来,烦着呢,华为有什么了不起
p没有释放内存,很显然造成内存泄漏。
太初级
改正后的程序为:
这个BUG很狡猾,它是一个逻辑错误,不是一个语法错误。所以程序是能运行的,甚至显示给你看的还是正确的结果。为什么呢?
由于字符串没有结束标记'\0',所以返回的h会将得到一些无用的字符,这是因为h碰不到结束标记'\0',它会一直向下查找,到发现'\0'标记为止。如果该字符串所占用的内存后面的内存是空的,就可能只显示反字符串,否则,不知道会有什么东东。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
char * revers(char *s)
{
    int len;
char *tt;
    len=strlen(s);
    //char *p=new char[len];
    char *p=(char *)malloc(sizeof(char)*len+1);
    char *h=p; 
    char *t;int l=len-1;
    for(t=s+l;l>=0;l--,t=s+l)
    {*p=*t;
    p++;
    }
*(p++)='\0';
        return h;
    
}
void main()
{
    char *s="string";
    printf("%s",revers(s));
    _getch();
}
田野说的对!
华为的考官就是这个意思!
错误岂止一个啊,首先算法效率就已经不高,分配的内存也不够,字符串结束的时候忘记加结束符,分配了的空间又没有释放。简直就是垃圾,我刚学C的时候也不至于出这么多错误啊
赫赫,程序写成这个样子也敢拿出来作考题,赫赫赫赫




                如果被问了这种问题,你应该说:“请问点有难度的问题吧,今天我很忙,不是来玩的。”你难道就一点都不以为这种难度的问题根本就不是用来考程序员的吗?简直就实践你在当三岁的小孩耍嘛。



这是华为的找bug题吧?
首先strlen返回实际长度。所以分配内存就少了一个字节。
然后,将源串copy完后,又没有在最后加一个\0.(想加按它这样也是个Access vialation.)
这本来就是改错题
华为不是一个软件公司



什么意思
华为确实不是一个软件公司。
面试华为的考题都很简单,象这样的已经很难了。
看这里,采用递归实现逆序
#include <iostream.h>
#include <stdio.h>

void Reverse( char* string)
{
  if(*string)
 {
  Reverse( string+1 );
  cout<< *string;
 }
}

void main()
{
 char   s[128];
 cout << "Please the string:" ;
 cin >> s ;
 cout << "The backward string is:";
 Reverse( s );
 cout << endl;
}
这是什么的考官啊。
小中见大,各位都在吹牛皮,你们看看,上面有几位把bug找全了呢,我看没有,华为出这道题,肯定有他的用心,华为人并不是吃干饭的,否则他也不会在国内那么出名!!!
话不能这么说,你先看看那个考题,那也叫程序呀,算法,语言的使用,哪有一样上的了台面?你出个改错题面儿上总得过得去吧。
说说我的看法,存在的问题如下:

1.strlen(s)得到的长度值不包括0,所以应多一个字符空间:
char *p=(char *)malloc(sizeof(char)*(len+1));
从而t的初值当然也不对了,应是t=s+len-1;
从而逆排后还要加个0。

2.循环中用t--更快,l在这里可不用。

3.在main中没有保存返回的h指针,所以逆排字符串的内存块无法释放,
解决方法是:或是原地逆排,或是改原型为char *reverse(char *src, char *tag);

4.我会这样写:
char *reverse(char *src, char *tag)
{
 char *p=tag+strlen(src);
 *(p--)=0;
 while (*src)
  *(p--)=*(src++);
 return tag;
}
main()
{
 char *tmpbuffer=(char *)malloc(100*sizeof(char)), *s="hello.";
 printf("%s\n",reverse(s,tmpbuffer);
 free(tmpbuffer);
}
若是原地逆排,可为:
char *reverse(char *src)
{
 char *p1=src, *p2=src+strlen(src)-1, tmp;
 while (p1<p2)
 { tmp=*p1, *p1=*p2, *p2=tmp; p1++; p2--; }
 return src;
}
我觉得这样写没什么不清楚的。而且strlen是用汇编写的,应该比自己的
while要快一点点,且易读。

5.虽然我没见过什么招聘的考试题目,但我觉得这可能不是真的考题,
有点.....。
 希望是真的吧,那样我就好找工作了。
关于效率
strlen尽管你可以认为它是汇编写的,但它决不会比while快
因为while也会变成汇编:)

strlen不见得比while快,呵呵,因为while最终也要变成机器码,呵呵呵呵
我觉得这题出得有意思,你能设计出这样在这么小的程序中出现这么多有代表性问题的问题吗?
有malloc没有free,对称性。有后面还有朋友在函数外delete呢,不还是关于编程的习惯问题的。不是许多人都强调不要在函数内申请内存而在其它地方释放吗?
另一个是关于字符串的结束问题的,你以为你平时编程序就一定注意到吗?
在别人说出来之后你觉得简单,但如果你自己的程序里有这问题你未必能很快找出来或者说你可能根本就不在意。但这是好习惯吗?
你见过大多数时候是好的而有时不知道怎么回事就是不正常的系统吗?这可能就与这小小的毛病引起的,你真的能时时注意到吗?
又是这道题,俺都要看的不耐烦了!
华为难道每年都是这些题贴来贴去的吗?华为太失败了!

为什么没有人使用STL??????????????????????
大家在嘲笑别人的时候 只是证明自己的无知 操!!!
redfaceeggs(夜深沉)
注意用语

这是就事论事,这道题用STL未免小题大做而且效率不高不合题意。

先让我们来看看这个函数的界面
char * revers(char *s);
如作为函数的使用者来说,我将存在以下疑问!
1  返回值是指向原来的字符串地址么?极不明确!
如果是:
  在原来的字符串地址上进行反序合理么?
  例如:
  char *str="hello";
  char *rstr=revers(str);
  cout <<"originally string :"<< str << " reversed string "<< rstr<< endl;
    高了半天两个string 是一样的。使使用者很容易犯下这样的错误。
    
如果不是:
那返回的字符串地针是指向的什么地址呢? 用malloc 分配在堆的?还是用new 分配的呢?
还是静态的缓冲区呢?(估计不会是栈上的吧:))
    还关系到我对于这块缓冲区怎样处理的问题,要不要释放?怎样释放?
    
2 我怎样知道函数反序成功了呢?
   我的理解是当返回值为null就是失败了。反之则成功!
char *str="hello";
char *rstr;
if(null==(rstr=revers(str))); 
//当然也可以写成if(rstr=revers(str)),但这样意思更表达不明显! 
在一上判断的语句中不要把赋值工作加上去!

那这个函数界面写成这样:
bool  revers(const char *ostr,char *rstrbuf,size_t buflen);
  应不需要解释参数了吧。

使用起来:
char *str="hello";
size_t nlen=strlen(str)+1;
char *rstr=new char[nlen];
if(revers(str,rstr,nlen))
{
........
}
delete [] rstr;
或使用auto_ptr更方便!

关于函数的实现,可以下:

bool  revers(const char *ostr,char *rstrbuf,size_t buflen){
assert(ostr);
assert(rstrbuf);
assert(buflen==strlen(obstr)+1);// 这里是不是有一个问题 buflen 空间大小必须与原来的一值么?要求过分?

*(rstrbuf+buflen-1)='\0';
while('\0'!=ostr && --buflen){
*(rstrbuf+buflen-1)=*ostr;
ostr++;
}
return buflne;
}
关注
char *p=(char *)malloc(sizeof(char)*len);
如果P 返回NULL的话,全歇,后面就是对一个不安全的指针进行操作,谁知道现在P 指向哪里,
也许是系统区。呵呵。我去中兴也碰到了。
    



       chishufei:
                  你其实是在找人帮你做作也吧,我今天去华为面试,就没见你的这些“经典题”。




给我加分:::::

我非常同意cppfan(易得糊涂) 的看法,如果叫我回答你也是这样,其他的方法全错!!因为用指针返回是非常危险的做法,应开以参数的形式传递并最终获得结果,这点你一定要记住!!不然华为一定会炒你!!!!!


前天万里兄的源码分析较为透彻;
Kevin伙计率先采用对称交换方法,的确可以提高效率并达到目的可惜算法实现不够精确,字符串正中部位的两处字符有时会得不到处理;
无忌的处理方法又有新意,但只是输出回环有效,而结果却没有保存。
我对源程序中revers子程序的意见:
1、该子程序返回指针值,该指针所指向的资源不可能是在该子程序内分配的,而只能是指针类型
   参数所指的资源,因此万里兄的代码中有
   a、 strcpy(s, p);//将回环字符串指针p的资源内容拷贝到s所指的资源中
   b、 return s;//*****s便是实参了*****
2、设有int len=strlen(s);
   a、则华为源码中char*p=(char *)malloc(sizeof(char)*len;应为
      char*p=(char*)malloc(len+1)
   b、在strcpy(s, p)之前,应有
      p[len+1]="\0";
3、回环算法:各位已有诸多展示,归纳起来为如下三种:
   a、经典算法:如万里和华为源码所示
   b、中心对称交换法:如Kevin所示
   c、递归法:如无忌所示
   d、其它.................................
   




    
出这样的题的侧重点是考程序员找bug的能力,以及对细节的注意,而不是考你的新技术。要知道一个小小的bug是很可能足以让一台交换机down掉的,到了那时候,电信局好多天的话费单可能就会因为这样一个小bug就丢了,电信局要赔偿的时候,开发人员可是要吃不了兜着走的。这些题目里要考的东西实际上也是开发人员常犯的错误的一部分,而且一般都是有以往的实际教训的。
让文本框输入完后,直接跳入下一行 -VB资料 VB如何编制带有不定个数参数的过程。 VB如何充分扩充VB功能 VB如何传递不固定个数的叁数? VB如何打开和关闭光驱门 VB如何导出收藏夹到文件或者导入文件到收藏夹 VB如何得到磁盘上剩余空间的值 VB如何得到应用程序的资料! VB如何调用chm格式的帮助文件 VB如何调用控制面版中的应用程序 VB如何动态更新数据报表 VB如何改变 NT 预设的打印机? VB如何改变 Windows 预设的打印机 VB如何关闭其他程序 VB如何过滤键盘录入 VB如何获得Windows95已经运行的时间 VB如何检测左右键同时按下? VB如何检查您的电脑是否打开 ActiveDesktop? VB如何将程序建立成“启动”文件夹的捷径? VB如何将程序建立成「启动」资料夹的捷径。 VB如何结束 Shell 所启动的程序? VB如何拦截键盘输入 如何判定VB调用的一个EXE程序已经结束. VB如何判断某一个Drive是否为光碟机? VB如何清空回收站? VB如何取得汉字的区位码 VB如何去优化你的VB程序 VB如何让点阵打印机每次印出一行? VB如何设计一个可中断循环的按钮。 VB如何实现VB程序登录密码加密 VB如何使程序不出现在任务列表中 请问:键盘上"DEL"按键的内码是多少? 问天下谁能帮我?从纸的上端10mm处开始打印 那位大哥知道成都高程成绩那儿可以查啊? 关于双连接上网。 帮朋友问个问题。一定帮忙啊各位大虾!可以另外开帖给分 怎样改变标题栏大小? 请问如何使image上的图形变成没有?谢谢! 帮帮忙:怎样将一个IP地址转换成一个二进制的数字(32位) 程序快完了, 不知道如何作安装程序 各位有水晶报表的资料吗?能否提供一些此方面的资料! c#更改系统日期 怎样改变标题栏的大小? 一个渴望学习网络知识的大三学生,请求各位学过和未学过认证的朋友的帮助!!!紧急等待中..... 寻CSharp的生成注释Web页的资料! 谁有9X下进入RING0 来HOOK API的源码?[急求中] 为何在我得浏览器里打开这里的帖子看到的是源代码? 求救!!请问我的Ie窗口关不了是什么原因,有什么解决办法 DBF问题 提问几个文盲问题 如何得到一台机器所在的工作组或者域名!~ 菜鸟题一个问题:想在oracle中实现一个定时任务 100分 如何一本书扫描并保存为PDF格式?利用PDF文件格式可否到数字签名的操作?Acrobat Reader 5.1新增了该功能,但我用不好。 真正的P2P技术,实现了Internet上局域网对局域网、局域网对公网、公网对公网的交互 在mysql中,php如何存取图片,给个例子行么? 如何一本书扫描并保存为PDF格式?利用PDF文件格式可否到数字签名的操作?Acrobat Reader 5.1新增了该功能,但我用不好。谢谢 导航条 大家来看一下啊,,, 关于IE和注册表的两个问题 CComboBox疑问? 如何在字符界面下更改linux的X图形界面? 请问pc机的Com是不是就是一个UART,还是别的什么结构,请告知 如何发布基于tomcat4的加密ssl协议http://的网站 ADO对象问题,在线等待. 查看那些访问数据库(sqlserver)引发死锁的线程的方法(菜鸟请教高手),在线等待...... 思路 如何将表格中的已有数据删为空?总是提示数据类型不正确,怎么办呢? 当FORM1窗体最小化时 如何注册c++build6.0?注册机用不了? 而当FORM1窗体最小化时 --在线等待,高手入内:-IE打印中4.23的问题--- 请问如何在另外一个服务器的文件里写入数据?帮帮忙,急!! 我的困惑 weblogic7.0部署JavaBean和Servlet问题 CComboBox的GetCurSel()问题? 象《金山快译》那样的导航条效果该怎么做了? sql查询的问题,急于解决,请指教! 请问笔记本的开机密码忘了怎么办? 我的困惑 如下小程序,怎么也有问题???请教!? 请问.asf用什么播放 有什么办法能把文本文件中的一个空行给删除 台湾当局提前扩建太平岛码头 应对南海康妮台风致40年一遇洪水 半个云林县郑洁战胜大威多次被雨打断 共耗时近7绿营:两岸服贸协议辩论 马英九苏贞昌中国女排险胜意大利 郎平上任后已豪取马来西亚华校幼儿教师风行来华研修 目切尔西官方宣布签约埃托奥 年薪700北仑象山住房公积金最高贷款额度回调至黑鸭子流入卤小二 工商部门证实两家门郑洁首赢大威 3小时拉锯战不给自己留薛蛮子欠嫖资 态度蛮横叫嚣自己是美国浙江省扎实做好今年十方面为民实事杭州市人大首次对检察官开展履职评议温州开房处长被判刑6年 开房百次终因姑娘深夜金华街头迷路 搭顺风车被摸腿杭州首次对检察官进行履职评议杭州5岁女孩爬窗找爷爷从20米高东园浙江义乌团伙利用微信组织卖淫 3天获4岁男孩开货车倒车 开了10多米差点贵州18岁小伙在义乌工作 被偷手机跑金华世纪联华边来必堡土狗咬伤俩人切尔西16-17赛季主场球衣发布美女探花专属配色,Nike Zoom母亲节广发借记卡100元立减38元非洲警犬宝宝协助保护大象(图)网购族注意!网购被坑,你该怎么办?RPG游戏新作《天军:无限争夺战》预广式烧鸭做法培训 满天红传统正宗品卡罗尔:洛瑞必须振作起来!布登霍尔泽谈变阵可能:会考虑所有的可2v2决胜关键 火影忍者手游小队激斗在潮湿的天气里衣服该怎么办?JR:一直在空位,所以就投了中美石油大战“风谲云诡”,大量囤油意卢谈2比0领先:做了我们该做的贝兹莫尔:原以为骑士第一场已经投疯波波:上一场输球责任在我们自己国米皇马将竞争边后卫法比尼奥库存暴增供应中断风险 油价后市“命悬斯科特:本以为还能执教一年湖人《天行九歌》霍尊MV发布 制作特辑揭保定-中国电谷智慧能源国际创新峰会成
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘