您的位置:首页 > 其它

百度2013校园招聘笔试题(自动化平台、测试开发)

2013-10-13 09:23 483 查看
一、简答题

1. 写出几种常见的哈希算法。简述哈希算法有什么作用。

2. 写出OSI七层网络模型。并指出HTTP,UDP,ARP通信分别位于哪一层。

3. 说明C代码在怎样的情况下可以正常运行,并说明运行原理。



二、算法与程序设计题

1. 现要将一车苹果装袋,装3个一袋余2个,装5个一袋余3个,装7个一袋余2个。写一个程序或伪代码,求N个满足条件的苹果数。

2. 写一个递归程序,求字符串中最长的重复字母数量。比如abbbccd返回3,abbc返回2。

3. 现需要开发一种社交关系网络,对一个用户A来说,可能会有如下关系:

A的父子关系:B

A的母子关系:C

A的朋友:C、D、E…

A的同事:F、G、H…



这些关系都是相互的,即C是A的朋友,那A也会出现在C的朋友关系中。

1) 设计数据库和数据表,可包含以下数据表:用户表、关系标签表、关系列表等,表的数量不限;

2) 设计伪代码实现输出A的所有关系表,需要有SQL实现代码,函数原型是

function getRelation(char* personName)

3) 基于1)设计伪代码实现添加一个人到A的关系中,需要有SQL实现代码,函数原型是

function addRelation(int personId, char* relationName, int typeId)

其中personId是A的身份号,relationName是新关系的人名,typeId是关系标签身份号

4) 以上的设计都是基于人名两两不相同而实现的,如果存在相同人名,则需要怎样修改来实现2)和3)的功能?函数原型在必要时可以修改。



三、系统设计题

(自动化平台研发工程师)

现需要维护一个100亿个以上元素的大数组,数据已经从小到大排序好。现在对这个大数组进行分段,每段长度不定,但最多不超过20个元素,对每段内的数据进行随机打乱。请设计一种方法重新对该数组进行排序,并分析其复杂度。

(测试开发工程师)

现有1000万个url,其中大约有10万个apk链接。现在百度需要做一个apk搜索引擎,请列出其中所有的有效apk链接,并且避免重复的链接。并且提出一种机制,过滤其中的恶意和虚假apk链接。



- – - -

以下是个人的一些解题思路,可能不甚正确,望大家指正和补足:

一、

1. 关于哈希算法:http://baike.baidu.com/view/273836.htm

2. 关于OSI七层网络模型:http://baike.baidu.com/view/547338.htm

3. 这个题很水了。简单的说分三步:编译、链接、执行;细分一点的话,编译包括预处理、编译、优化和汇编;链接分静态和动态。具体可以见这篇文章:http://lavasoft.blog.51cto.com/62575/187229

二、

1. 因为装3个和装7个都余2个,所以等价于装21个余2个,可以考虑以21n+2这样向上检查。

1
cnt
 = 0; i = 2;
2
while(cnt
 < N) {
3
i += 21;
4
if(i % 5 == 3) result[cnt++] = i;
5
}
2. 这道题个人觉得其实非递归算法更容易想到。递归算法可以这样思考:设m和n分别表示字符串S[m..n]的起始和结束下标,k表示S从m开始第一个与m不同的字符的下标,maxRepeated(S[m..n])表示S最长的重复字母数量,则当m=n时,maxRepeated(S[m..n]) = 1;否则maxRepeated(S[m..n]) = max{ k-m, maxRepeated(S[k..n]) }。

1
unsigned int maxRepeated(char*
 S)
2
{
3
unsigned int k, max;
4
if(*S == '\0') return 0;
5
for(k = 1; S[k] != '\0'&&
 S[k] == *S; k++);
6
max = maxRepeated(&S[k]);
7
max = k > max ? k : max;
8
return max;
9
}
3. SQL不是我的专长所以不贴具体算法了。当时胡乱写了点,用户表拿id作key,含name项;关系标签表给各种关系以relationNameId为key编号;关系列表relationId作为key,含relationName,user1,user2,每一个关系存一项。

三、

(自动化平台研发题)

大数组由于已经排好序,所以分段打乱后总体还是递增的。看题意应该是用归并排序的思路。关键是分段方法,因为每段数据不超过20个,不妨就以20个一组进行强行分段。对排好序的分段S[20k..20k+19], k=0,1,2,…,只要20k不恰好是实际分段的开头,则一定能找到一个p[k]使得S[20k..p[k]]属于上一个分段的一部分,其中20k <= p[k] <= 20k+19。

我们从S[20k..20k+19]的左侧开始扫描,根据S[p[k]+1] > S[20k-1]找到p[k]。由于每段个数不超过20个,则可以对S[p[k]-19..20k-1]和S[20k..p[k]]进行归并,而事实上由于上一个分段的起始不会在p[k-1]的左侧,因此事实上可以对S[max{p[k-1]+1,p[k]-19}..20k-1]和S[20k..p[k]]进行归并。

对S[20k..20k+19]进行归并排序的时间复杂度是O(20log20),扫描得到p[k]的时间复杂度是O(20),对S[max{p[k-1]+1,p[k]-19}..20k-1]和S[20k,p[k]]进行归并的时间复杂度是O(20),因此整体的时间复杂度是O((n/20)*(20log20+20+20))=O(n)。

1
unsigned int processGroup(int*
 S, unsigned int k, unsigned int last_p)
2
{
3
unsigned int p;
4
mergeSort(S, k*20, k*20+19);
5
if(k == 0) return0;
6
for(p = 0; S[p] <= S[k*20-1]; p++);    //
 find p[k]+1
7
if(p == 0) return 0;
           // for sector head, do nothing
8
p--;              // p[k]
9
last_p = last_p+1 > p-19 ? last_p+1 : p-19;
10
merge(S, last_p, k*20-1, k*20, p);
11
return p;
12
}
(2012-11-20 更新)这道题也可以采用1楼QJ的思路,算法更方便(感谢提供算法)。由于每个分段不会超过20个元素,故对每一个k>19,元素S[k]一定大于S[k-19]前的任意一个元素,故可以直接在S[k-19..k]中做插入。一次插入的时间复杂度为O(20),整体的时间复杂度为O(20n)=O(n)。



(测试开发题)

为解决重复url问题,需要建立类似哈希表的结构。考虑到10万量级空间占用较大,想到直接使用外存来做,按照url的路径建立目录结构即可。例如http://domain/dir1/dir2/name.apk可置于$ROOT/domain/dir1/dir2下,可下载下来(易于检查恶意和虚假链接),也可不下载只生成一个占位文件(此时可以根据apk的大小等属性来判断是否为恶意和虚假链接)。

以上的叙述,尤其是第三大题只是我的个人思路,如大家有什么更好的思路欢迎讨论指正。

原文链接:http://www.swingworks.net/2012/11/baidu_2013_recruit_test/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: