09百度笔试记

    今天去了百度笔试。做的是RD-1的题目。先说说题目吧。

    第一题是描述树的深度遍历,广度遍历和非递归实现的特点。基本数据结构,简单。

    第二题是改错。程序如下:

  1 typedef {
  2     int num;
  3     int imag;
  4 }Complex_t;
  5
  6 int alloc(Complext_t * a,int num){
  7     a=new Complex_t[num];
  8     if(a==NULL){
  9         return -1;
 10     }
 11     return 0;
 12 }
 13
 14 unsigned long long compute(){
 15     Complext_t * a;
 16     int num,pos;
 17     unsigned long long sum;
 18     cin>>num;
 19     if(alloc(a,num)<0){
 20         return -1;
 21     }
 22
 23
 24     cin>>pos;
 25     while(pos<num){
 26         cin>>a[pos].num>>a[pos].imag;
 27         cin>>a[pos+1].num>>a[pos+1].imag;
 28         sum+=a[pos].num*a[pos].num+a[pos].imag*a[pos].imag;
 29         sum+=a[pos+1].num*a[pos+1].num+a[pos+1].imag*a[pos+1].imag;
 30         pos+=2;
 31     }
 32     return sum;
 33 }

大概是这样吧。我找出下面错误。

第六行:Complex_t *变为Complex_t * &
去掉第八至第九行。因为根据C++99new不再返回NULL,而是throw std::bad_alloc
18行的cin没有检查cin.fail()是不是返回true
19行应该用try...catch围绕
24同理于18行
25行的条件可能导致越界访问,所以应该改为pos<num-1
26,27同理于18行

 

第三题就开始有点难了,我是最后才做出来的。问题是一个1K内存和1MHz和CPU(意味着它1秒钟能改变10^6次状态),问如何在不死循环的条件下让它最长时间的运行,而且是因为某个状态退出的。可以假设你的条件。 

一 开始我毫无头绪。最后终于醒悟,应该用最最底层的办法做。就是在内存放着一段代码,就这样让它跑。怎么让它跑得最长又不死循环呢?我想应该是让除了代码之 外的所有内存在一个周期内加一位,也就是说把剩下的内存看作一个巨大的整型,正如int是32位一样,这个内存区域是XXX位。好了,我假设CPU是16 位的8086,初始状态寄存器全部是0(考试的时候我犯傻了,居然写32位x86)。
程序段放如下编码:
start:   
    inc al 1B
    jno start 3B;不溢出则重新增加
    xor cx,cx 2B
overflow:
    movb al,[data_start+cx] 3B;data_start是数据起始地址
    inc al 1B
    movb [data_start+cx],al 3B
    xor ax,ax    2B
    jno start 3B
    inc cx 1B
    jmp overflow 3B

于 是代码段使用了1+3+2+3+1+3+2+3+1+3=22B,还剩1024-22=1002B内存用于数据存储。另外还有1B的寄存器,所以是 1003B的存储区域。另外假设改变内存状态和改变寄存器状态一样只花一个周期,还有忽略别的消耗(比如上面的xor cx,cx)这样状态会改变2^1003次,所以最长时间为2^(8*1003)/10^6。上面这段代码会在越界访问的时候退出。

 

然后就到了算法题;第一题说的是编译依赖问题。说的是一个系统有N个组件组成,N个组件之间有依赖关系。为了解决依赖,必须确定编译的顺序。问算法。
其 实这是著名的穿衣问题,问题是一个人有内裤,裤子皮带……这些东西,问人应该怎么穿才能不变成超人!所以解决方法也是一样的,就是拓扑排序。拓扑排序是先 对图中所有子节点进行广度优先的遍历(郑K说是深度遍历,我敢肯定他错了,因为深度遍历得到的是一棵树,而不是几棵,依赖关系可能不只是一棵树的),然后 在遍历同时标记遍历的起始时间和结束时间,然后对起始时间进行排序。

 

第二题是编程题。实现的是从字符串返回一个具有最长连续数字的子字符串。比较简单,但是我犯了至少3个逻辑错误,日,我真是个傻逼,操。

 

第三题是系统题。设计一个url存储系统,特点是分布式数据库,条件是快速访问。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值