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

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

编辑:说三道四文库 发布时间:2017-09-25 07:09
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就丢了,电信局要赔偿的时候,开发人员可是要吃不了兜着走的。这些题目里要考的东西实际上也是开发人员常犯的错误的一部分,而且一般都是有以往的实际教训的。
【多图】鼠标、光驱等13个即将消失的PC技术 直击OpenStack美国峰会:分享五大经验收获 Project Savanna:让Hadoop运行在OpenStack之上 看Go桌面技术副总,如何解读Facebook Home 增长最快的游戏公司Supercell 你学得会? 移动周报:为什么我们出不了IT神童? AWS、VMware和OpenStack谁是赢家? 消息称苹果正在寻找新任CEO取代库克 请别人云亦云 PC仍然重要且活得很好 比预想晚几年!IBM x86服务器或终将卖给联想 App推广的节操呢? iMessage垃圾短信产业链暗访 Apkudo CEO访谈:免费为Android开发者提供测试 Web API核查表:设计、测试、发布API时需思考的43件事 开源Android构建工具Buck 速度超Ant两倍 从史上八大MySQL事故中学到的经验 OpenStack Heat向应用市场更近一步 初创公司Ionic Security:云安全必须与时俱进 谷歌董事长:一年后消费者才能用上Goolge Glass Windows 8.1重新推出的“开始按钮”毫无意义 手眼并用 代码泄露三种Google Glass手势操作 Google新论文 CPI&#178;:基于Linux的世界级跨数据中心服务器CPU监控 20款非常实用的Web工具和资源列表 数据库界大事件 随机写性能巨好的TokuDB开源了 CMDN Club 26期:数字渠道营销主题沙龙 暴强:用iOS设备控制的HTML5“小蜜蜂”游戏 Leap Motion:500元体感,精确到0.01毫米 大事件:三大运营商将发布融合计费SDK 再培养一个扎克伯克:六款适合儿童上手编程的App 首届中国软件工程标准高峰论坛:软件开发的新机遇与挑战 Verizon研究显示:中国成为2012年度网络间谍攻击的主要来源 Clang宣布全面支持C++11标准 sdk&组件更新 急,在线等待! 高分请教,有关菜单的 请教各位一个文件问题! 向各位高手请教 请关注国内第一套真正意义上的OLAP套件! 如何在access 2000里面使用SQL语句建立表 请关注国内第一套真正意义上的OLAP套件! 关于同一个包中的引用问题! 关于数据库关联显示的问题 请问如何确定安装程序的进度 请关注国内第一套真正意义上的OLAP套件! 如何将excel中数据加入到access中去呢? 急=>救救我:怎么约束用户只能输入中文呢?(用正则表达试吗?) 关于游戏大厅的作用???(来者有分) lhb再吗? 如何作出中关村这个效果?http://product.zol.com.cn/products/product_search.php?subcatid=28 怎样把两个BYTE连接成一个short类型 关于 <select>....</select>的问题 急,请各位老大指点:popmenu为什么有时候会出现在屏幕的最左上角 如何给多个变量赋值? Lotus Domino Server 怎样在局域网(没有连入internet)中设置,目录服务器?我想用netmeeting给学生们上课 寻找大连的朋友,共同参加趋势程序设计大赛! 急=>救救我:怎么约束用户只能输入中文呢?(用正则表达试吗?) 问一个超简单的问题。 新手的问题-- dataset或datatable中可以存放dataset吗?(在线) 问一个超简单的问题。 在c/s下面如何分页呢? 网站社区近日遭到不明人物的攻击,如何解决 如何查看死锁时1204跟踪标志错误日志清单,有分相送! 流光的启动画面很漂亮啊~~请问是怎么实现的? 如果要大量生产自己的产品和在市场上销售... 难受!没有信誉了,怎么活呀?人讲的什么呀?讲得是信誉呀. XML初学者问题:刷新数据 一个汇总查询的问题?? 请问,在用VB.NET写WEB应用程序时要怎么在网页间传递变量. 大家帮帮忙! 请问高手,在用MDI和数据库相连后,怎么样把自动生成的Form当成Page? 如何利用单片机取得电话来电号码? 如何插入名次字段数据? 如何插入名次字段数据? 在远程计算机上执行一个应用程序时,该程序用的是我的资源还是对方的? 用Borland C++ Builder 开发企业管理系统 又出现错误了????? 求助!!如何在StringGrid中显示ADOconnection中的数据?? 为了运行XML,服务器究竟要怎么样才行? directx屏幕捕获,为什么我的这段代码不行 小问题,大侠帮忙,小弟不胜感激!!!!! 我想使用一个字段来存储2万字左右的文章应该用什么类型(text不够用的)? 向非窗口类的对象发送消息呢? 延年益寿的益在词语中什么意思,我没有赏薪了,还有自强不息的息、举世闻名的举、摩肩接踵的踵, Thank you for giving me such useful advice.You're welcome.That's ____ friends are ____. 《我和僵尸有个约会3》中完颜无泪,嫦娥,瑶池圣母的扮演者是谁啊?怎么都那么漂亮! 青春期是多少岁到多少岁? Thank you for giving me such a beautiful night 瑞吉欧教育体系的课程对我国幼儿园课程有那些启示? "子"开头的词组有些什么 男孩的青春期从几岁开始到几岁结束? 本人初三 如何提高英语阅读理解本人英语主要是阅读理解和完形填空不行 求方法 把“born”换一个字母,改成另一个英语单词 男孩进入青春期的年龄 路由器 的 ACL 延年益寿的益是什么意思 男生的青春期是几岁开始的?从几岁开始,几岁结束?男生开始青春期有吧些表现? 速回 专家哈 我觉得我的嘴巴一下肿一下小的.特别是早上、大太阳时感觉嘴巴比其他时候要肿.到了晚上变小了.咳,急 asset与equity的区别 l have four apples 什么是太阳时 英语翻译我刚起步学会计~equity 是独立存在物/实体 的意思,迷茫ing~ 单克隆抗体是异源二倍体吗 为什么早上和傍晚看太阳时太阳的直径要大些 请问会计公式 ASSETS+Expenses+Drawing=Liability+Owner's Equity+Revenue 如题.A+E+D=L+OE+R 请accounting高手帮我解释一下! 跪求4.5.6大题,要过程写到纸上,初二数学,跪求了 “踏破铁鞋无觅处,得来全不费工夫”说明了灵感是?A突然爆发的B宛如神助的C艰苦酝酿的D神秘莫测的 liabilities are claims agaist asset 各位帮帮我吧,跪求4.5.6大题,要过程,写到纸上,跪求了绝对采纳 以踏破铁鞋无觅处,得来全不费工夫为主题的作文能给个题材、提纲之类的么?最好举例,2、3个都行 为什么我每天都吃很多饭仍然长不胖. 电压表到底测的是谁的电压 关于踏破铁鞋无觅处,得来全不费工夫作文 为什么我每顿饭吃得很多,却长不胖?(非诚勿扰)为什么我每顿饭吃得很多..却长不胖?我身高180体重却还不到110.我看过了中医,也吃过两副中药.肠胃应该没什么问题,也不是经常的拉肚子.就是 我这起的是什么?在腰上、怎么治啊 请问成语踏破铁鞋无觅处,得来全不费工夫的意思和解释,用踏破铁鞋无觅处,得来全不费工夫造句及其故事典�请问成语踏破铁鞋无觅处,得来全不费工夫的意思和解释,用踏破铁鞋无觅处,得来 为什么我吃许多的饭 不长胖. 羚羊木雕人物关系快! 你踏破铁鞋无觅处,得来全不费工夫的作者 为什么我吃再多的饭也不长胖AH He has got three apples.中has got 做什么成分 英语翻译•drivers will not wait for you to make reservations when you arrive at the airport. 为什么我吃再多的饭都不长胖? 求一篇初一英语首字母填空要有六个以上的空字不能太少 英语翻译The Employment Contract shall be automatically terminated in accordance with the terms of this Agreement at the first arrival of the Ship in port of discharge after expiration of the contractual employment period or of any other period sp A.will have;give.B.will have;will give.C.have;giveWe --- more time to play sports as long as our teachers--- us less homework Amy has the f-------apples of the three girls. 晚上背对北斗七星,前后左右分别是什么方向?答案应该分别是东南西北四个方位,但不知道具体是哪个对那个… 我要50个100字左右的历史故事,至少90字,最多110字. 求一篇初一英语的首字母填空是完整的一篇,不要太长哦.要让同学抄的,太长偶怕挨揍=.要求:短小精悍,容易看懂, 在北极点,前后左右的方向有几个? 有"马"字的历史故事 我和僵尸有个约会中嫦娥的眼睛是什么颜色 延年益寿中的益是什么意思 家乡的马500字快 我和僵尸有个约会中的嫦娥是谁 延年益寿的益在成语中的意思 关于马的历史故事 30字一定要短,否则就别打了 我和僵尸有个约会里面的嫦娥叫什么名字都演过什么电视 坚持体育锻炼,各一延年益寿的益是什么意思坚持体育锻炼,可以延年益寿的益是什么意思 在生活中你遇到过羚羊木雕文中类似的事吗写下来 200∼300字 我和僵尸有个约会3里饰演嫦娥是谁 福布斯全球影响力榜安倍位居第57位 成品油价迎十年最小降幅 90号汽油降日本一女大学生因在公园拍摄成人视频被日本一男子弑母弃尸 藏尸冰箱月余终败阿萨德与卜拉希米会晤 称叙命运由本国克罗地亚第一副总理兼外长将访华制造长沙黄花机场恐怖信息的犯罪嫌疑人39岁女子当选日本年度\"美魔女\"十八大后10次集体学习 新领导层施政一线城市房价居高不下 中央勾勒住房问首都机场进出港航班正常 未提升安保等盘点全球超萌迷你动物 最小狗狗脑袋仅金正恩接见朝鲜第267部队 感谢该部万圣节怎么过?经典日本恐怖片让你吓破人品爆发!美国男子中611万后仅隔两“甲壳虫”乐队主唱列侬儿时故居48万美国承诺不再窃听联合国 对此前传闻不中国—东盟能源合作进入“零关税”时代中国驻圣彼得堡总领事和留学生谈梦想中国军方就日舰闯入我演习区提出严正交日本发现一种化合物可预防糖尿病等疾病2.5万“皖军”海外书写传奇,半数来合肥公共服务设施规划项目公开征集意见中国铁路首次尝试同站台换乘列车小情侣车站前生纠纷 引民警携枪到场处揭秘合肥职业催款人:要签保密协议,感中国新型万吨级锻造机试车 航空发动机世界杯神奇一幕 你见过这么有爱的球队香港新界庆回归 26万市民参与169河南文科状元卷入运动员加分舞弊案 学二季度甘肃省查处252起无证行医案件加拿大移民部长为新入籍法辩护 否认存“体彩杯” 深圳少儿锦标赛 赛事播报换造型与画外音深圳打拼的建设者最值得关爱听《归来》再思索博爱20周年20000支玻尿酸倾城回三伏天试试三伏贴澳大利亚一特种部队士兵在阿富汗受枪击华裔指加州大学枪击案凶犯早有征兆 周兰州市国资委出台《办法》国企重大事项8月1日起兰州市治污示范区将推行“三
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘