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

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

编辑:说三道四文库 发布时间:2017-05-29 03:47
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就丢了,电信局要赔偿的时候,开发人员可是要吃不了兜着走的。这些题目里要考的东西实际上也是开发人员常犯的错误的一部分,而且一般都是有以往的实际教训的。
CMDN Club 27期:从儿童音乐教育到移动碎片化管理 聚焦全球移动市场——你所不知道的俄罗斯 MemSQL:号称世界上最快的内存-关系型数据库 兼容MySQL但快30倍 PC衰落 Intel转投Google挖掘移动市场潜力 移动周报:500元体感、精确到0.01毫米的Leap Motion TUP第29期:王淮、龚世海谈如何打造优秀的技术团队 一网打尽13款开源Java大数据工具,从理论到实践的剖析 从用户体验的善与恶说起,做用户爱“玩”的教育应用 三大主流开源硬件对比:Arduino vs BeagleBone vs Raspberry Pi “BlackBerry 10移动应用开发大赛”应用推荐 Java程序优化的一些最佳实践 Heka:Go编写,来自Mozilla,高效、灵活的插件式数据挖掘工具 Anchora鲁为民:PaaS是我的兴趣 次世代IDE Light Table 0.4发布 带来众多更新和改进 别再设计易碎的Web API! LinkedIn:55人支持2700位员工,2亿用户的大数据分析 Brian Krzanich是谁?这位新CEO预示英特尔未来怎样? HTML5开发者心声:浏览器兼容性成最大问题 传微软6月下旬将发布第二代Surface 7到9英寸全有 Turbulenz:HTML5 2D和3D游戏引擎开源 携程开放平台总经理夏天:内容+高转化率成就开发者 直接拿来用!最火的Android开源项目(一) Qunar 谌振宇:旅游行业的移动化如何布局? 大数据分析“铁三角”: Teradata数据仓库、Teradata Aster与Hadoop Teradata专业服务:打造行业企业的“数据科学家” Xamarin Evolve 2013:竭尽全力让C#服务iOS与Android 史上最全!57个Web框架4轮横向对比 回顾银行数据的可用性和一致性历史 Qubole:托管在AWS平台上的Hive服务 自由操作系统 Debian 正式发布7.0版本 4月份浏览器份额:IE 8仍居第一,IE 10翻番 sql server 2000 的配置参数疑问? 如果计算机有多个IP地址,如何得到主机的默认IP地址? 想订杂志但不知道哪些杂志好?诸位能给点意见与我吗???(图像类和网络类 想订杂志但不知道哪些杂志好?诸位能给点意见与我吗???(图像类和网络类 请问join的用法,谢谢! 请好心人帮帮忙吧,可以这样用VC做服务器组件吗? tomcat+apache为什么样会有这样的错误? 怎样在一个PROJECT里启动另一个PROJECT?大虾一定是轻车熟路的! 这样的写发为什么他只取第一个啊??? 在windows API中,有没有那个函数可以直接调用来显示cpu利用率的————请教!! 学FOXPRO到底还有没有用啊?为什么大学课程里都有它啊? 哪里有公式编辑器(包括数学,化学等公式)的ocx 或com呢? 急救 sqlserver 6.5 急~~到底是病毒作孽还是系统问题?? 燃眉之急,请各位指教 怎么知道数据库是否存在某个存储过程,在线急等! 请教:取CppWebBrowser中的page source 为什么我提交后的页面却又Dreamweaver打开了提交后的页面? 我用web程序生成了word的document的对象,怎么通过网页输出word文件?不是保存到硬盘,而是response到用户? 一道怪题,欢迎讨论 谁知道关于调整麦克风音量的API函数???请叙述详细一些,紧急,谢谢!!!!!! 发布一个串口调试程序,若用的着请进,急急急!!! 请问有那些关于vc界面的书呢? 请问大家硬盘是怎么装的,电路板朝上还是下,或者是斜着的?对硬盘有没有影响?up有分 关于动态SQL的问题,请各位大虾帮忙,急急.............. 为什么触发器只触发最后一条记录?(付触发器) 怎样查找一个时间范围的数据? 在Workflow流程中,如何实现域值的改变? 访问该页者有分!!!!!!!!!!!!!! 数据库问题!急用! 为什么触发器只触发最后一条记录?(付触发器) 我用web程序生成了word的document的对象,怎么通过网页输出word文件?不是保存到 俯卧撑次数首次超40,放分! 一个使用motoSDK的问题请较! 一个奇怪的问题?? 我用web程序生成了word的document的对象,怎么通过网页输出word文件?不是保存到硬盘,而是response到用户? 一个非常初级的问题。 中国积极培养电脑“网络战士” ---泰晤士报星期刊 sco unix 高手请进 我再放!! 求救!!!!!!一个SQL的问题 为什么用中断1A获取网卡的配置空间时,在偏移量10h处只能获取mac地址的前8位,后4位无法获取??? 我又放!! 存储过程的高级应用问题,急用! 在combobox中禁止某些字符输入,为什么不成功? 我没完没了的放!! 怎么把数字39显示成0039,同理9显示成0009,多谢指教(在线等待) 大虾:如何用ADO向Access2000的BLOB字段中放图像文件?请赐教!... ASP.NET 调试问题 pb 有没有中文版呀`~~或者是汉化包呀`~ 如何做程序组安装盘???---在线等候!!! 碳酸钠常期暴露在空气中会发生氧化还原反应吗?如题.若会,如何体现?谢谢. 修改病句.你去劝劝他,让他不要再把过去的往事放在心上了. 日本地震持续多长时间啊?我四月份要去福冈,打算长期去那. 水碰到煤气会爆炸吗 如何蒸馏甲苯 从物理学熵的知识从经济学角度谈谈人与自然如何和谐相处 碳酸钠和盐酸反应,属于氧化还原反应吗? 甲苯加入碳酸钙水洗后蒸馏最后会泛酸是什么原因 橡胶的耐腐蚀性怎么评判? 相同温度下,把水面上的空气换成同压的纯氧,100克水中溶解氧增多请说得详细点 谢谢 有谁做过臭氧介入治疗腰椎间盘突出,效果怎么样?有没有什么风险?最好是有具体操做的过程, 橡胶为什么耐腐蚀这是作业 帮帮我 谢了. 如何防止煤气发生炉爆炸 提问:腰椎间盘突出症,臭氧介入治疗合适吗 自然界里某一区域的生物形成一个平衡和谐的整体叫做(生态系统),所有生物及生活环境共同构成了( ).就是括号里的 rp啥意思梦幻西游 3M600测试胶带 做什么用 帮找一下事理说明文的阅读方法 双螺纹换热器和波纹管换热器有什么区别? 3m网速如何真正测试是真正的3M我家用的是网通开通的3M网速,可是好慢,通过什么方式可以知道是真正的3M.为什么下边显示的是100.0mbps,是不是3M对应的就是100.0mbps 自然界里某一区域的生物形成一个平衡和谐的整体叫做()如果其中的一个环节收受到影响就会影响该区域的( 高压锅的胶圈坏了,可又不知道要买多大的?(是小的高压锅)帮帮忙 物体在拉力F作用下以0.3m\s的速度做匀速直线运动 测力计的示数5n 拉力多少 摩擦力多少 自然界里某一区域的生物形成了一个平衡和谐的整体叫做?如果生态系统中的一个环节受到了破坏整个系统就会 不锈钢波纹管换热器波纹管管束组装的注意事项? 怎样去除密封圈的橡胶味 铁锈水应该怎么办?进来有个鱼塘水质上面漂浮一层象铁锈一样的浮膜,想请教大家怎么样才能迅速改善?不能换水,水源不方便. 氧化铁和稀硫酸是氧化还原反应 地震了怎么办? 水里有铁锈怎么出去? 10KV/80KVA变压器负荷电流怎么算?怎么算超负荷运行?一台10KV/80KVA的变压器用钳形表量A相电流为60,B相电流为40,C相电流为90,按照公式计算I=S/1.732/U 该变压器负荷电流为115A,是不是A,B,C相的电流一 不锈钢铁皮用什么打眼 关于人与人和谐与人与自然的文章要有事情,是一篇作文 锌和稀硫酸的反应 氧化噶钙和水的反应 氧化铁和一氧化碳的反应 那些是氧化还原反应 不锈钢铁皮和不锈刚有区别么?不锈钢铁皮有什么特性?有0.3mm厚度的么? 日本明治维新成功给我们怎样的启示?中国戊戌变法失败又给了我们什么教训? 性到底是什么东西,人们为了它可以让家庭破碎为什么 不锈钢卷各厂的外包装颜色有太钢、宝钢、酒钢、广州联众、张家港浦项、克虏伯、青岛浦项、宝新这些 发生于19世纪中后期的日本明治维新与发生于19世纪末的中国戊戌变法,为什么一个成功一个失败?试从时代背景,领导者,改革的参加者,改革内容几方面进行比较. 什么东西破了才能吃? 马原 怎样处理人类与自然界的关系 日本明治维新与中国戊戌变法,为什么一个成功、一个失败?从时代背景、领导者、改革内容比较. 硫化氢与硫酸铜能否发生氧化还原反应按高中知识,二者反应生成硫化铜沉淀和硫酸.但硫离子有还原性,铜离子有氧化性,二者能否发生氧化还原反应从而生成铜和硫单质?请从电极电势和离子 试述日本明治维新的主要内容、性质和历史意义内容全面一点 溶解氧饱和度升高原因有哪些? 通过一件事反映出来母爱的作文600字以上 什么东西叫它名字它就破了 人类与自然界中的动物应该形成什么关系?为什么? 用完的文具胶带剩下的胶圈是什么塑料 简述日本明治维新的背景、内容及影响. 科学技术的发展与人类对自然界的认识有何关系? 作文,表现母爱的一件事情,高中水平的. 外径100 长500的钢柱的重量怎么算 求公式 人和自然究竟是一种什么关系呢?保护自然界的丰富性有何意义? 煤气发生炉水夹套超压爆炸的原因有哪些 80kv|A的变压器,最大承受负载是多少KW.最大电流是多少,如果加上四台电炉总功率在70KW的话,那么使用之于80KW|A的变压器是否合理从那里看出变压器的功率因数呢如果电炉已经采用可控硅整流的 甲苯带水蒸馏后 甲苯和谁在容器中分层后都是透明的怎么样把水分掉 煤气发生炉水夹套给水硬度超标,请问会造成什么影响? 你去劝劝他,让他不要再把过去的往事放在心上.(修改病句 日本地震持续了多长时间不算余震,就是9.0的晃动,几秒?几十秒?还是几分钟?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘