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

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

编辑:说三道四文库 发布时间:2017-01-24 11:17
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就丢了,电信局要赔偿的时候,开发人员可是要吃不了兜着走的。这些题目里要考的东西实际上也是开发人员常犯的错误的一部分,而且一般都是有以往的实际教训的。
OS X平台上出现窃取比特币的木马 《近匠》第11期:Arrownock——移动社交构建师 面向企业:Google发布iOS版Google Admin应用 Github推出Education平台 师生免费享有微账号 平板的市场依然巨大:应用更丰富,Phablet设备存局限 免费的PCB数据3D转换工具 OBD++ XVL Converter Hadoop Namenode以regular方式启动代码流程分析 走进支撑过8亿用户的Yahoo!数据中心 Napier,一个引领Rackspace14年老兵功成身退 Twitter最新测试版被指仿Facebook的界面设计 成功求职者的自述:如何向应聘企业展示自身价值? 仅用移动开发服务:一分钱不花,开发native应用 苹果员工爆辞职内幕 Windows Phone 8.1被曝光信息汇总 Phaser:开源的HTML5 2D游戏开发框架 HTML5调查:做的好,收入不比iOS差 汽车巨人福特让“数据”说话 基调数据解读2014网购行业的3大变化 测测:用百度Clouda占卜移动互联网 微软的无奈:或允许Android应用运行于Windows平台 如何选择适合自己的编程语言 Google Now新增语音命令:生活简单一点,让爱更近一点 千万美金收购案:GetJar是一家怎样的公司 传苹果与时代华纳等公司合作,推新一代Apple TV 追本溯源 解析“大数据生态环境”发展现状 为Hadoop存储层增加对OpenStack Swift的支持 详解并行逻辑回归 在AWS上使用GPU实现分布式神经网络 大数据时代,看“小数据”如何支持决策 22人15天研发 微信红包系统发起“珍珠港偷袭”的背后 开发产品防脱节,DevOps来帮忙 我问:win *上带的录音机录制的文件会不会过大?有没有小些的东东呀? 甚末情况下多线程程序会导致系统时间变慢? 网页制作 请问:如何在英文98环境下显示中文? 在oracle中基于oci,怎样把"select * from user";中获取的内容显示出来 VB6.0在WIN2K上为什么有问题? to wbill and 51looklook。 请问.doc文档的格式。 网络怎么ping不通? to wbill and 51looklook... 请问高手怎样用API去完成打印机纸张的改变! 请问mp3软件开发高手 应该是一个比较简单的问题吧------但急死我了! 关于人事系统1 还是datawindow取值问题,流芳请进 如何屏蔽SHIFT键? 如何在QuickRep中画线??(SOS) 寻求读串口(RS-232)寄存器状态的dll 谁有ico集和开发用的图片集请email给我,或告诉我那里有download 请教多媒体软件高手 printtext的问题 讨论一下 BCB 有钱途吗 关于SQL数据库恢复问题,请各位DX帮帮忙! 今天又不想灌水 MM让我看这个 http://fe4.bj.163.com/cgi/read?b=bridge&t=4481&i=4481&al=5&n=0&l=20&back=6&guest=1 hehe 高分请教高手:当打包 (packaging) 一个纯 Java 应用时,应该包括那些东东? 谁能告诉我 IBConsole 在哪里?? 哪儿有Formula One 下载? 关于数据库的一个小问题 我也不想灌水 我建了一个CSplitterWnd,包含一个CListView和一个CScrollView,如何在CScrollView的函数中为CListView添加一项,删除一项 誰有 1stclass3000 for delphi6 的注冊碼,小弟先謝了!! 高分请教高手:在 VA Java 中,如果要从工作台 (workbench) 运行一个 bean ,应满足什么条件? 如何用fso,把变量的内容写到指定文本文件最后一行?请快帮忙,急用! 谁有抓图控件 我有电子版的BC++4.0库函数详解,PDF格式,谁要????? 有谁知道怎样用做触发器? 一则sqlserver7数据锁定的问题! delphi如何实现文字纵向打印? 哪位在www.eu.org上注册过免费域名?教教我。 不好意思,怎样在access 2000中做触发器? 超级送分题:给TDBGrid手动添加一行记录 a,b两个表,如何查找a表中的每条纪录是否与b表的某条纪录相同,需要2个游标吗? 请问哪里有提供.org的免费域名吗?.org/yourname的也行。 请问如何得到对方的IP,以后定加分(因为我现在只能一次加21分) 聪明的你一定能帮我?? Fwnes模拟器在Win98下的速度极不正常 请问句柄是什么意思? 什么工具可以分析软件运行时调用了哪些OCX和DLL? 哪里有ASP的新闻更新系统 DLL调用的问题 地球上到底有多少动物 地球“温室效应”至少会带来什么恶果(5种).分别给人类带来什么灾难. 全球变暖会对地球有什么样的影响? 世界上最强壮的动物是什么动物? 地球“温室效应”带来的恶果有什么恶果,这些恶果分别会给人类带来什么灾难? 温室效应如果继续,未来地球会怎样?要视频 地球上一共有多少种动物现有的 地球温室效应至少会带来下列几种严重恶果:恶果 丨 给人类带来的灾难两极冰山融化,海平面上升 丨地球上的病虫害增加 丨气候反常,海洋风暴增多 丨土地干旱,沙漠化面积增大 丨前面的表 人来活动是如何影响全球变暖的?未来地球变暖对人类的影响? 地球上什么动物最大? 地球“温室效应”至少会带来下列几种严重的恶果:给人类带来的灾害有哪些?如果有六年级下册的[品德与社会]这本书,见40页的反光镜. 如果地球继续这么变暖会有什么后果?今年的冬天一点也不象前几年那么有冷.我感觉地球要完了 每年大概有多少种动物消失在地球上 地球温室效应还有什么恶果? 地球变暖意味着什么? 地球上有多少动物? 温室效应的危害为什么最近几年很冷 地球气候变暖有什么影响为什么会造成这一系列的破坏影响 有一种动物曾经是地球上最大的动物,后来在地球上消失了.这是一种什么动物? 全球变暖的危害是什么? 地球持续变暖我们该怎么做这是我的作业,希望越快越好,要有具体的方案. 地球上曾经出现过的最大的动物是什么是蓝鲸还是恐龙? 温室效应会有哪些危害? 地球变暖 在地球上已经存在的动物中,哪种最大 温室效应有什么危害?通俗,易懂,最好有分类以及如何预防~ 关于地球的温室效应~`土地干旱,沙漠化面积增大 给人类带来的灾难?再写一个( ) 给人类带来的灾难? 地球上最大的动物是什么 天气变暖对地球有什么危害?比如南极冰山融化越快 这是一块什么石头?是化石吗、是什么化石呢? 地球上,最大的动物是什么? 地球气温在变暖了吗? 帮我看看这块石头 是不是化石啊如题 如果是 是属于什么话是 地球最早的有脊动物是什么 地球上气候为何会变暖 这是什么石头?这个值钱吗? 生存在地球最早的动物是什么 地球环境按现在程度恶化下去,若干年后有第三次世界大战爆发?请详细陈述.为什么这样说? 请问有人能辨别这是什么化石吗?这块化石在井下开采中破损,图片上是大部分。特征为成扁平椭圆,中间有突起一圈。边缘有数圈凸棂。通体呈黑色薄层,黑色层下为白色。 恐龙是不是在地球上最早的动物? 若干年后的地球想象作文 如何辨别化石 太阳 水星 金星 地球 火星 木星 哪个行星离地球最远 现在地球上最早的动物是?大神们帮帮忙 气候干旱和地球变暖有直接关系吗? 水星、金星、地球、火星称为______行星? 温室效应会给人类带来哪些危害? 全球气候变暖导致一些冰川融化并消失,在冰川小事12年后,一种低等植物苔藓开始在岩石上生长.每一个苔藓都会长成近似的圆形,苔藓的至今和其生长年限,近似的满足如下的关系式:d=7乘√t-1 地球到底是变暖了还是变冷了为什么有的人说地球变冷了 温室效应有哪些危害? 全球气候变暖导致一些冰川融化并消失,在冰川消失12年后,一种植物苔藓就开始在岩石上生长,每一个苔藓都会长成近似圆形,苔藓的直径和冰川消失的年限,近似地满足如下的关系式:,其中d代 地球究竟是变暖?还是变冷?冰山消融,海水上涨,气温升高,生态破坏……温室效应带来的全球气候变暖恶果已经明白无误地显现在世人面前.气象学家发现,根据过去两年的监测资料,大气中二氧 关于二氧化碳与温室效应火星的空气中二氧化碳质量分数大约是95% 那么根据地球上的二氧化碳较多能就导致温室效应,是否可以表明火星上的温室效应十分严重呢?请大概阐述一下理由 全球气候变暖导致一些冰川融化并消失,在冰川消失12年后,一种低等植物苔藓,就开始在岩石上生长,每一个苔藓都会长成近似的圆形,苔藓的直径和其生长年限近似的满足如下的有关系式:d等于7 地球是变暖还是变冷?本人觉得不可以这样说,几十年相对几十亿年是多少的微不足道啊 二氧化碳的温室效应这是作业题目,拜托大家帮帮我.(具体解释一下两者之间关系就行) 全球气候变暖,冰川融化,史前生物是否会再现?看过《解冻》之后感慨万千呢,这部电影真的很不错,我觉得大家都应该看看这个不是动画片 是恐怖片,而且这些都是现实问题啊,世事无绝对, 地球到底是变暖还是变冷? 地球温室效应主要来源二氧化碳含量高,那么如何在空气中收集二氧化碳啦?低碳生活,为地球降温, 全球气候变暖导致一些冰川融化并消失,在冰川消失12年后,一种植物苔藓就开始在岩石上生长,每一个苔藓都会长成近似圆形,苔藓的直径和冰川消失的年限,近似地满足如下的关系式:,其中d代
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn