CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

百度在线笔试题求解(二)!!!!!!!!!!!!!!

楼主neoadane(乌云)2006-10-08 22:16:32 在 C/C++ / C++ 语言 提问

1.(5分)下面这段代码是把中英文混合字符串(汉字用两个字节表示,特点是第一个字节的最高位为1)中的大写字母转化为小写字母,请找出其中的bug,注意各种异常情况。  
  for   (char   *piterator   =   szWord;   *piterator   !=   0;   piterator++)  
  {  
  if   (*piterator   &   0x80   !=   0)  
  {  
  piterator++;  
  }  
  else   if   (*piterator   >=   'A'   &&   *piterator   <=   'Z')  
  *piterator   +=   32;  
  }  
   
  2.(5分)对给定的上亿条无序的url,请按照domain、site以及path分别排序,并请指出排序过程中可能会遇到的哪些问题?如何提高效率?  
  例如:http://www.baidu.com/path/about.html,domain、site以及path的定义分别如下:  
  Domain:baidu.com  
  Site:www.baidu.com  
  Path:   www.baidu.com/path  
   
  3.(10分)某型CPU的一级数据缓存大小为16K字节,cache块大小为64字节;二级缓存大小为256K字节,cache块大小为4K字节,采用二路组相联。经测试,下面两段代码运行时效率差别很大,请分析哪段代码更好,以及可能的原因。  
  为了进一步提高效率,你还可以采取什么办法?  
  A段代码  
  int   matrix[1023][15];  
  const   char   *str   =   "this   is   a   str";  
  int   i,   j,   tmp,   sum   =   0;  
   
  tmp   =   strlen(str);  
  for(i   =   0;   i   <   1023;   i++)   {  
  for(j   =   0;   j   <   15;   j++)   {  
  sum   +=   matrix[i][j]   +   tmp;  
  }  
  }  
   
  B段代码  
  int   matrix[1025][17];  
  const   char   *str   =   "this   is   a   str";  
  int   i,   j,   sum   =   0;  
   
  for(i   =   0;   i   <   17;   i++)   {  
  for(j   =   0;   j   <   1025;   j++)   {  
  sum   +=   matrix[j][i]   +   strlen(str);  
  }  
  } 问题点数:100、回复次数:35Top

1 楼hziee_()回复于 2006-10-08 22:41:07 得分 0

B段代码  
  int   matrix[1025][17];  
  const   char   *str   =   "this   is   a   str";  
  int   i,   j,   sum   =   0;  
   
  int   temp   =   strlen(str);  
  for(i   =   0;   i   <   17;   i++)   {  
  for(j   =   0;   j   <   1025;   j++)   {  
  sum   +=   matrix[j][i]   +   temp;  
  }  
  }  
  肯定比较好。  
  Top

2 楼iambic()回复于 2006-10-08 22:50:39 得分 0

1题,if   (*piterator   &   0x80   !=   0)应该加个括号:  
  if   ((*piterator   &   0x80)   !=   0)  
  别的看不出来。  
   
  2题,研究过排序算法的人来说吧。我不懂。  
   
  3题,好像A段代码好点吧。是不是这样定义数组更好些:  
  int   matrix[15][1023];  
  或者  
  int   matrix[16][1024];?  
  还是熟悉计算机的高手来吧。  
  tmp也不用每次都加吧。  
   
  没说什么,其实就顶个贴而已。^_^Top

3 楼neoadane(乌云)回复于 2006-10-08 22:52:40 得分 0

呵呵,谢谢~Top

4 楼fflush(stdin)回复于 2006-10-08 23:30:57 得分 0

第3题A段代码更好,因为A的局部性更好,反映在体系结构上就是cache的命中率更高,因此比B要好很多。Top

5 楼laiwusheng(风清扬)回复于 2006-10-09 07:20:30 得分 0

markTop

6 楼superskilledman()回复于 2006-10-09 10:53:25 得分 0

你们什么时候给baidu投的简历啊?  
  什么时候他通知的在线笔试啊?  
   
  为何我没有接到通知呢?Top

7 楼superarhow(苏泊尔耗)回复于 2006-10-09 11:16:30 得分 0

第一题真正的bug是  
  if   (*piterator   &   0x80   !=   0)  
  {  
  piterator++;  
  }  
  这里没有考虑是否是最后一个字节就加了1,假设输入的串是:  
  char   a[]   =   {0x80,   0};  
  那么在piterator++之后,for循环又会++,就漏掉了那个0,而去判断一个非法的地址的值是不是等于0,就瓦了。Top

8 楼OOPhaisky(异化$渴望成功~~)回复于 2006-10-09 11:40:18 得分 0

哈哈,baidu的笔试题目答多了,我发现都大同小异^_^Top

9 楼superskilledman()回复于 2006-10-09 12:23:00 得分 0

if   (*piterator   &   0x80   !=   0)中0x80是什么意思啊?  
  好像是一个16进制的数,但是它在这里进行&运算又有什么意图呢?  
   
  高手们,帮忙解释一下哈,多谢!Top

10 楼dbjk(独臂剑客)回复于 2006-10-09 12:58:29 得分 0

0X80二进制就是1000000,所以能够判别.  
  1:&运算要加括号,因为&运算是自右向左的.  
  2:排序过程中会遇到重复的值,提高效高可以先开始确定Domain让字符唯一,即开始排序前保证都是唯要的,其间可以用KMP算法优法.  
  3:1023   /   8   =   128  
      而1025   要分配129字节空间.一级数据缓存大小为16K字节,cache块大小为64字节刚好128.  
   
  百度笔试题是不能公开的,LZ不厚道.  
   
  嗯,百度对我太远了........Top

11 楼kulongus(公司会计说:零钱太少了,你还是半年领一次工资吧)回复于 2006-10-09 14:02:48 得分 0

mark  
  Top

12 楼superarhow(苏泊尔耗)回复于 2006-10-09 14:57:31 得分 0

第1题确实要加括号,!=优先级比&高Top

13 楼Richard_Hong(武昌鱼)回复于 2006-10-09 15:41:26 得分 0

markTop

14 楼98440622(民工++)回复于 2006-10-09 15:48:29 得分 0

markTop

15 楼huke1980(飙风)回复于 2006-10-09 15:50:17 得分 0

请教下  
  一级数据缓存大小为16K字节,cache块大小为64字节刚好128  
  怎么算出来的Top

16 楼blue_zyb()回复于 2006-10-09 16:10:48 得分 0

to:   superarhow(苏泊尔耗)  
  可是题目说“汉字用两个字节表示,特点是第一个字节的最高位为1”  
  那0x8000的第一个字节高位为1,处理为汉字,所以后面的00是属于该汉字的,而不应该作为结束符吧Top

17 楼neoadane(乌云)回复于 2006-10-09 16:44:13 得分 0

to:superskilledman()    
  国庆之前投的,昨晚上给我通知的,今天早上笔的。。。  
  做得很郁闷。。。Top

18 楼lwaaa(迦叶)回复于 2006-10-09 16:44:51 得分 0

markTop

19 楼neoadane(乌云)回复于 2006-10-09 17:00:50 得分 0

to:dbjk(独臂剑客)  
  我觉得程序员之间是应该互通有无的,相信每个人(除了大牛)笔试面试前都会希望能找到点相关资料吧。  
  还是谢谢你的解答哈。Top

20 楼vsong(房价越来越高,所以,好男人越来越少……)回复于 2006-10-09 17:12:03 得分 0

markTop

21 楼Jerffsan(ayun)回复于 2006-10-09 17:20:52 得分 0

第一题:  
    经调试得知:&表达式应加(),  
    if   (*piterator   &   0x80   !=   0)语句是处理汉字Top

22 楼superarhow(苏泊尔耗)回复于 2006-10-09 17:31:43 得分 0

to   blue_zyb()   :  
  括号的错误是主要的。至于会不会有0x80,0这样的输入,个人觉得还是应该判断一下,毕竟题目上说了要注意异常情况,偶们不是学院派,不过字符串通常是从外部得来的,出现什么样的都有可能的。Top

23 楼laiwusheng(风清扬)回复于 2006-10-09 17:53:07 得分 0

markTop

24 楼xiaov007()回复于 2006-10-09 18:34:22 得分 0

好热闹啊:>发表点意见。  
  第一题改为:  
  if   ((*piterator)   &   0x80   !=   0)  
  {  
  piterator++;  
  }  
  else   if   (*piterator   >=   'A'   &&   *piterator   <=   'Z')  
  *piterator   +=   32;  
  }  
  感觉原来的表达式相当与:*(piterator   &   0x80)Top

25 楼shareyao()回复于 2006-10-09 19:32:13 得分 0

同样mark!Top

26 楼dbjk(独臂剑客)回复于 2006-10-09 22:13:54 得分 0

 
  To   neoadane(乌云)  
   
  你误会了我的意思,哦问一下你属于那个地区的,如东北,西南,或东部之类的,就是你大学所在地区。Top

27 楼houdy(致力于图像/图形领域,成为有思想的程序员)回复于 2006-10-09 22:47:22 得分 0

对于第一个问题,我在我的BLOG中进行了深入的分析:  
  http://blog.csdn.net/houdy/archive/2006/09/24/1271448.aspxTop

28 楼dick248()回复于 2006-10-09 22:56:43 得分 0

mark  
  Top

29 楼neoadane(乌云)回复于 2006-10-10 00:01:53 得分 0

to:dbjk(独臂剑客)  
  呵呵,中部吧,怎么了?Top

30 楼dbjk(独臂剑客)回复于 2006-10-10 00:19:09 得分 0

to:neoadane(乌云)  
   
  ------------  
  我还认为你是四川西南地区的呢,没什么问问而已,祝你好运。Top

31 楼neoadane(乌云)回复于 2006-10-11 23:15:03 得分 0

呵呵,3x!Top

32 楼caoyuflyin21st(木头人)回复于 2006-10-12 15:35:43 得分 0

if(mark)  
      ...  
  else  
      ...Top

33 楼yuanxiaofei()回复于 2006-10-12 16:42:41 得分 0

if   ((*piterator   &   0x80   !)=   0)  
  {  
  piterator++;  
  }  
  是为了跳过汉字的第二个字符。  
  看不出还有什么bug?  
  高手指教,详细啊,很菜,不详细看不懂Top

34 楼Dugowe(我不是火星人,我家狗狗才是..)回复于 2006-10-12 17:53:16 得分 0

markTop

35 楼IMGGTOO(寻找自己的远方)回复于 2006-10-12 22:23:07 得分 0

赶回时髦,也来个  
       
          mark!!!Top

相关问题

关键词

得分解答快速导航

  • 帖主:neoadane

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo