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

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

编辑:说三道四文库 发布时间:2017-03-27 06:59
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就丢了,电信局要赔偿的时候,开发人员可是要吃不了兜着走的。这些题目里要考的东西实际上也是开发人员常犯的错误的一部分,而且一般都是有以往的实际教训的。
如何在全屏幕显示一个AVI文件-Delphi资料 删除文本文件中的多余空格-Delphi资料 实现Hint的分行提示-Delphi资料 实现应用程序的文件拖放功能-Delphi资料 死循环的控制权转让-Delphi资料 添加桌面快捷-Delphi资料 统计中英文字个数-Delphi资料 为 应 用 程 序 添 加 口 令-Delphi资料 应用软件加入全面的功能权限控制-Delphi资料 用Delphi编写安装程序 用Delphi实现超级链接 用Delphi实现子目录级的文件查询 用Delphi自制英语复读机 用DEPHI为应用软件建立注册机制-Delphi资料 优化delphi5.0秘籍大曝光 元件的handle的建立-Delphi资料 元件卷动的改进-Delphi资料 在delhpi程序中获取网络资源信息-Delphi资料 在Delphi中操作快捷方式 在DLL中实现文件的拷贝-Delphi资料 在Report Builder中增加自定义函数-Delphi资料 在Win2000 Beta下安装Delphi 在Word插入字符-Delphi资料 注册表中几个对编程特别有用的地方-Delphi资料 资源文件在DELPHI中的使用 自制替换指定串函数-Delphi资料 API函数快速入门API函数简介-VB资料 API函数快速入门怎样在VB中声明和使用API函数 API函数在VB开发中的应用 API函数在VB中的应用 API实现完美的图片出现效果-VB资料 关于SQL SERVER 数据库连接? iis4下载 请教 在线等待:把VIEW1中把所有字段 VVV 中值相等的纪录 中所有字段中的值相加怎么办? 有关数据窗口的问题 那里有cscwbook(计算机协同工作导论 史美林等编)下载,谢谢! 如何得到登陆到服务器上的所有机器IP地址 大家说说.....(高手快进) 菜单 如何实现在TabPage之间切换 有谁知道ActionList1控件是做什么用的吗? vb制作浏览器的问题 QuickRpt制作的报表存盘的问题。 请问在VB中如何做饼行图和柱状图? c++中ctor是什么意思? 关于数据库 对话框数据共享的问题 怎么让我的非模式对话框出现在屏幕中间 高程有无含金量 进程,线程。STA,MTA ,COM 对象之间的关系?请讲解一下,举一个例子。谢谢 {KDE}:我的KDE进不去了 返回值是动态数组的函数如何递归调用? 关于Tdatetimepicker的显示格式问题 谁能告诉我那里有visual c++ 6.0 技术内幕的光盘??? 关于JPEG和MJPEG??? 进程,线程。STA,MTA ,COM 对象之间的关系?请讲解一下,举一个例子。谢谢 一个关于动态链接库的问题 关于WEB共享的问题? Oracle8i不能登录,报告“凭证检索错误" 我想结束一个话题,回复次话题者得分。 密码忘了怎么办 数据库高手请进 关于AC97声卡(100芬) 如何将javascript对象中的内容保存到数据库中去???? 失恋了,非常郁闷,想散分都不行(各位开导开导) 在西文dos下,打开txt文件,并在屏幕上显示,怎么编程呀? 天理何在?为什么降我的信誉值,这个论坛谁说了算,出来说个理由。 Visual J++ 6.0的问题! 关于Word,IE等程序的设计模型问题? 在线等待BCB+Access 怎样实现如vc集成开发环境的控件窗口 关于asp.net控件使用中的一些问题 请问,怎样做出桌面动画(比如鸟在桌面上飞等等....) 文本处理里面可以包含图片么? 如何判断用户输入的是中文还是英文,数字,或者是非法的字幅。 简单问题,50分奉献! 一个关于序列的问题,各位帮帮忙!! 是不是程序中的配置文件.config只能在运行期间读取,而不能更新数据?如果能更新那怎样更新,我没有找到更新所用的类。 世界上最大的塔里班........ ???? 我还是不明白,这是为什么 ???????? 关于寻址 如何得到想要的Excel表中的正确行数,救命!!! 210匹马力是多大功率 英语,判断题 1升油等于多少斤? 海豚和鲸哪个是热带哺乳动物 海豚是鲸吗? 一升油等于多少斤 一马力大概等于多少千克.顺便解释一下一马力是什么概念. 英语的判断题用什么表示今年孩子4年级期末考试,你认为对的就填“F”,你认为错的就填“T”,这样出题对吗? 造句 狗、猫、鸡狗用拟人和比喻造 、猫用排比造、鸡用对比造、 454克=多少斤,两,400克=多少斤两 大的海豚叫鲸, 验证牛顿第二定律为什么要平衡摩擦力?小车在平面上运动时,小车的G根本没有分力来承担摩擦力啊? 鸭嘴兽是胎生还是卵生? 每相邻两个计数单位之间的进率都是十的计数方法叫() 为什么验证牛顿第二定律的实验一定要平衡摩擦力?不平衡的话不是可以算出来吗? 转矩是力吗转矩,扭矩是力吗 英语判断题请给答案判断题,括号里的是否正确1.The woman was (at a loss) what to do as she was frightened by the gun of the attackers.A.错误 B.正确2.I didn't go to the party,but I do wish (I had been) there.A.错误B.正确3.(Nobo 已知圆柱体底面直径和容积如何求高 海豚是卵生还是胎生 一个罐头是个圆柱体,底面直径10厘米,高15厘米,在这个罐头盒上面的商标纸正好围着罐头盒围了一圈,求面积另外一个罐头是个圆柱体,底面直径10厘米,高15厘米做这个罐头和至少需要铁皮多少 一个圆柱体,直径是1600毫米,高是2400毫米.它的容积是?公式是什么?一圆柱体直径1600毫米,高2400毫米。求能装多少m3水?计算公式。 鸭嘴兽是卵生还是胎生? 一个长方体纸盒长62.8厘米宽40厘米高15厘米用它装一种底面直径是10厘米高15厘米的圆柱体罐头最多可以装个 从前有只狗,狗前有只猫,猫前有只老鼠,老鼠后面有只猫,猫后面有只狗,狗后面有什么? 鸭嘴兽是胎生,还是卵生呢? 下图是一个圆柱体“牛肉罐头”的表面展开图.请你算一算,这个圆柱体“牛肉罐头”的容积是多少立方厘米?《铁皮的厚度不计》 猫,老鼠和狗编一个童话400--500字 鲸是胎生的还是卵生的?拜托各位告诉我啦! 有种圆柱体罐头盒,把它的侧面展开,正好是一个边长12.56厘米的正方形.这种罐头盒容积约多少升?(保留整数)把一个高20厘米的圆柱体沿底面直径纵切为两个相等的部分,表面积增加了240平 梦见狗,老鼠,猫梦见老鼠向我跑来,被我躲开,我转身一看结果成了狗了又瘦又凶,然后旁边又有只肥猫,结果也变狗了但是看起来又好像是猫.反正看起来像猫我说是狗意识里也是狗. 乌龟、蛇、鳄、企鹅、鲸、海豹等动物在水中是如何呼吸的?好像都没有鳃吧! 高圆柱体+低圆柱体=0.55 高圆柱体+正方体=0.45 低圆柱体+正方体=0. 5 问高圆柱体是多少千克 探究牛顿第二定律中怎样平衡摩擦力?有没有什么数值计算啊 地球上最大的动物是什么A鳄鱼B鲸C鲸鱼 圆柱体和半圆柱体是0.55千克,圆柱体和正方形是0.45千克,半圆柱体和正方形是0.5千克圆柱体是多少,半圆柱体和正方形是多少?要算式.五年级的题目. 请问猫是抱着什么心情去追得耗子、而狗呢?如题、请问猫追耗资时候心情怎么样、够追猫呢?耗子追猫呢?耗子追够呢?狗追耗子呢?请回答的同志列详细、谢谢最好再提出一点猫狗耗子一起聚 风筝在重力,风力和绳子的拉力共同作用下保持平衡.绳子与水平方向成30度角斜向下方,绳子对风筝的拉力是2N,如果绳子突然断了,此时重力和风力的合力为 ____N,方向_________. 泥鳅,黄鳝是_______类动物;乌龟、鳄鱼是________动物:蝙蝠、鲸是______动物._____、_____、_____属于绿色不开花植物,它们自己进行光合作用制造养料.狗尾草、属于_____植物;香樟树、小叶黄杨属 圆柱体和正方体共重0.55千克,圆柱体和小圆柱体共重0.45千克,小圆柱体和正方体共重0.5千克,求每个物体多好的话多加5 如图,悬挂在天花板下重60N的小球,在均匀的水平风力作用下偏离了竖直方向 =30度角.求风对小球的作用力和绳子的拉力.(图看http://attach.etiantian.com//ett20/study/question/upload/2006/9/5/1160015409975.doc) 一书静止在桌面,书受到的支持力和桌子受到的压力是同时发生吗一书静止在桌面上,书受到的支持力和桌面受到的压力是同时发生吗 一个圆柱体,高9.55米,直径4.6米,它的体积是多少? 氢气球重十N,空气对它的浮力为16N.用绳拴住,由于受水平风力作用,绳子与竖直方向成30度,则绳子的拉力多大,水平风力大小多大 200毫升等于多少斤两 一道英语判断题原文:Chuck was in my high-school English hononrs class.He was a writer of great promise.So when he told me he had been accpeted into the journalism program at the University of Missouri,I wasn't surprised.判断正误:When 悬挂天花板下重60N的小球在恒定的水平风力作用下偏离竖直方向30度求风对小球的作用力个绳子的拉力 英语判断题1.I’d rather not have coffee.A.错误B.正确满分:4 分2.He is seriously ill.He is going to die.A.错误B.正确满分:4 分3.He was on his way home.A.错误B.正确满分:4 分4.they named the city after his name.A.错误B. 帮忙做一道英语判断题We are aill busy talking about and using the Internet,but how many of us know the history of the Internet?Many people are surprised when they find the Internet was set up in the 1960s.At that time,computers were large an 大学电工电子判断题, 英语中的判断题就是像{判断下列单词划线部分的读音是否相同,相同的打“√”,不同的打“×”.}这种题目, 英语判断题!1急! 物理、电工师傅帮忙解一下这几道判断题. 海豚是不是鲸? 验证牛顿第二定律的实验实中,没有平衡摩擦力小车加速度与砂和小桶总重力关系图线 10匹空调大约是多少功率,正常运行大约多大电流 一个圆柱体侧面展开后是一个边长12.56厘米的正方形,这个圆柱体的底面直径是( )厘 一道英语判断题,求原因 30A等于多大功率 鲸和海豚的区别 1升食用油等于多少斤
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘