今天去了百度笔试。做的是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存储系统,特点是分布式数据库,条件是快速访问。