百度面试题汇编

1、介绍一下项目。

  2、提了一个问题:上千万条记录,统计出重复记录最多的前N条。

  3、一个概率题:54张扑克牌,除去两张大小王剩下52张扑克牌。问红桃A和黑桃A同时被一个人拿到的概率是多少?

  4、多个线程访问共享内存时因该怎么办?

  5、在写程序遇到问题的时候,通常采用什么调试方法?

  6、一个client/server的协议问题

  7、剩下就是随便聊聊,比如有缺点、期望工作的性质、职业规划等

百度电话面试题目:

  1.谈谈你对数据库中索引的理解

  2.现在普通关系数据库用得数据结构是什么类型的数据结构

  3.索引的优点和缺点

  4.session和cache的区别是什么

  5.如果有几千个session,怎么提高效率

  6.session是存储在什么地方,以什么形式存储的。

给定二叉树前序序列:"EDBA**C***HF*G***" 。
构建此二叉树(非递归),
并后序输出二叉树(非递归)...。


百度面试题:从输入url到显示网页,后台发生了什么?

2010-09-11 10:31

当在浏览器中输入一个 url 后回车,后台发生了什么?比如输入 http://hi.baidu.com/mianshiti 后,你看到了IT面试题的博客首页,那么这一切是如何发生的呢?

 

简单来说有以下步骤:

1. 查找域名对应的IP地址。这一步会依次查找浏览器缓存,系统缓存,路由器缓存,ISP DNS缓存,根域名服务器。

2. 向IP对应的服务器发送请求。

3. 服务器响应请求,发回网页内容。

4. 浏览器解析网页内容。

当然,由于网页可能有重定向,或者嵌入了图片,AJAX,其它子网页等等,这4个步骤可能反复进行多次才能将最终页面展示给用户。

 

百度面试题:三个警察和三个囚徒的过河问题

2010-04-03 21:30

三个警察和三个囚徒共同旅行。一条河挡住了去路,河边有一条船,但是每次只能载2人。存在如下的危险:无论在河的哪边,当囚徒人数多于警察的人数时,将有警察被囚徒杀死。

问题:请问如何确定渡河方案,才能保证6人安全无损的过河。

 

警察囚徒过去,警察回来

囚徒囚徒过去,囚徒回来

警察警察过去,警察囚徒回来

警察警察过去,囚徒回来

囚徒囚徒过去,囚徒回来

囚徒囚徒过去

 

百度面试题:设计DNS服务器中cache的数据结构

2010-03-25 21:30

要求设计一个DNS的Cache结构,要求能够满足每秒5000以上的查询,满足IP数据的快速插入,查询的速度要快。(题目还给出了一系列的数据,比如:站点数总共为5000万,IP地址有1000万,等等)

 

DNS服务器实现域名到IP地址的转换。

 

每个域名的平均长度为25个字节(估计值),每个IP为4个字节,所以Cache的每个条目需要大概30个字节。

总共50M个条目,所以需要1.5G个字节的空间。可以放置在内存中。(考虑到每秒5000次操作的限制,也只能放在内存中。)

 

可以考虑的数据结构包括hash_map,字典树,红黑树等等。

我觉得比较好的解决方法是,将每一个URL字符串转化为MD5值,作为key,建立最大或最小堆,这样插入和查找的效率都是O(log(n))。

MD5是128bit的大整数也就是16byte,比直接存放URL要节省的多。

 

百度面试题:将多个集合合并成没有交集的集合

2010-03-20 18:25

给定一个字符串的集合,格式如:{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出{aaa bbb ccc ddd hhh},{eee fff}, {ggg}。

(1)请描述你解决这个问题的思路;

(2)请给出主要的处理流程,算法,以及算法的复杂度

(3)请描述可能的改进。

 

集合使用hash_set来表示,这样合并时间复杂度比较低。

 

1. 给每个集合编号为0,1,2,3...

2. 创建一个hash_map,key为字符串,value为一个链表,链表节点为字符串所在集合的编号。遍历所有的集合,将字符串和对应的集合编号插入到hash_map中去。

3. 创建一个长度等于集合个数的int数组,表示集合间的合并关系。例如,下标为5的元素值为3,表示将下标为5的集合合并到下标为3的集合中去。

开始时将所有值都初始化为-1,表示集合间没有互相合并。

在集合合并的过程中,我们将所有的字符串都合并到编号较小的集合中去。

遍历第二步中生成的hash_map,对于每个value中的链表,首先找到最小的集合编号(有些集合已经被合并过,需要顺着合并关系数组找到合并后的集合编号),然后将链表中所有编号的集合都合并到编号最小的集合中(通过更改合并关系数组)。

4.现在合并关系数组中值为-1的集合即为最终的集合,它的元素来源于所有直接或间接指向它的集合。

题目中的例子:

0: {aaa bbb ccc}

1: {bbb ddd}

2: {eee fff}

3: {ggg}

4: {ddd hhh}

生成的hash_map,和处理完每个值后的合并关系数组分别为

aaa: 0。[-1, -1, -1, -1, -1]

bbb: 0, 1。[-1, 0, -1, -1, -1]

ccc: 0。[-1, 0, -1, -1, -1]

ddd: 1, 4。[-1, 0, -1, -1, 0]

eee: 2。[-1, 0, -1, -1, 0]

fff: 2。[-1, 0, -1, -1, 0]

ggg: 3。[-1, 0, -1, -1, 0]

hhh: 4。[-1, 0, -1, -1, 0]

所以合并完后有三个集合,第0,1,4个集合合并到了一起,

第2,3个集合没有进行合并。

 

算法的复杂度为O(n),其中n为所有集合中的元素个数。

哈希表加并差集,先用哈希把字符串转成整数,转换的时候就用并差集来操作求集合的并,建立哈希O(n) 哈希查询O(1) 并差集复杂度不好估计,大概为a*O(1)


五桶球,一桶不正常,不知道球的重量和轻重关系,用天平称一次找出那桶不正常的球。


面试题汇总:

1.描述一下自己以前做过的与这个职位相关的一些经历,2-3分钟时间(从开始接触测试,到自己的实习经历balabala)

2.详细描述一下跟这个职位最接近的实习工作的具体内容
3.如果进了百度,你觉得你每天都要做些什么样的工作呢

4.如何测试百度搜索引擎

5.算法:2n个数,一半奇数,一半偶数,设计一个程序让奇数位上的数是奇数,偶数位上的是偶数,并计算程序的空间复杂度和时间复杂度
6.开放性问题:怎么样统计世界上一共有多少个理发师
7.现在有一台打印机或者多台打印机,你要怎么样进行测试,要测哪些点
2011年百度质量部—测试工程师
1.定义栈的数据结构,要求添加一个min函数能够得到栈的最小元素,要求min,push,及pop的时间复杂度都是0(1),简要描述思路。2.这道题是一个程序题,要求写出运行结果,及分析程序的不安全因素。
3.分别采用线性表,二叉平衡树木,哈希存储数据,分析优劣。
4.有一串首位相连的珠子,m个,都有自己的颜色,全部颜色共有n(n<10)种,在里面截取一段,要求包含所有颜色,并且长度越短越好,如何截取?
5.设计一个strmuncmp函数,比普通的strcmp差别在于当字符串遇到数字时,以数字的大小为准,只有其中一字字符串味数字的情况,仍用strcmp函数比较
6.在大规模数据处理中处理一个词搭配字典,条件为:
   1)字典中存在的项是两个词的搭配例如:“今天”和“晚上”,他们组成的搭配为“今天晚上”“晚上今天”
   2)10万量级的词集合
   3)一个词并不会和其他所有词搭配,通常只有和不超过1万个其他词搭配
   4)字典使用的读操作很多,通常每秒钟有上千次请求几乎没写入要求
请设计一个字典服务系统,当请求时两个词的搭配时候,能够快速返回搭配的相关信息,请使用尽可能少的资源,并估算出是使用的机器资源
 

今下午两点刚面完
1、用c完成一个函数char* function(char * s,int n),返回s的前n个字符(这里不清楚char*可以指一个字符串?),要求尽量考虑健壮性。
 
磨了几分钟发现还是不会用c,后来允许用java后写出来了个,没怎么考虑太多异常情况。之后又问了加入自己测试这个函数,应该怎么测试。balabala了些数据
 
2、假设有N个(大约几百万个文件),每个文件存储的都是英文单词,文件大小都是1MB左右。输入一个单词,输出包含这个单词的文件名(按文件大小排序)。要求尽量优化算法。
 
一开始,理解成文件里面存的是不定长的连续字符串了,光给了个分块扫描,还想着用KMP,被否决;磨了一段时间,后来发现文件的单词是用空格隔开的。再提示下,给出了个多叉树结构(类似于字典树?),每个节点存储包含这个单词的文件名链表。
再问把文件名插入链表的时候如何考虑最优算法(要排序)。先说了个遍历,被否决,二分查找之类的也不行;后来想到二叉排序树,提到了,好像这个就是面试官要的答案,不过我又提出用排序树查询方便,但是输出排序的结果(深度或广度遍历)没有直接链表遍历方便。
 
3、问了个socket编程,如何设计服务器端。
 
回答多线程,每一个请求开一个线程。又问假设大量用户请求来到的话如何优化(提示线程的创建与销毁比较耗资源)。想到数据库连接池的原理,套用在这里(其实不知道socket能不能这样用),貌似面试官还比较满意。
 
4、一个数据库,为了保证响应速率,会在数据库和客户端之间建立一个缓存,缓存里存储数据库常用的结果(容量为10000条item或1GB)。客户端先查询缓存,若没有结果再查询数据库,当查到结果之后再把这条结果添加到缓存中。对缓存的操作包括添加、删除、搜索item。 要求尽量全面的测试这个架构。
 
5、其他还问了对测试流程的理解,问了下实习情况。面试结束的时候还追加了UNIX下I/O模式?和如何在linux下查看程序资源消耗情况(这两个都不会)
 
 
总结:发觉这个面试还是比较靠人品,上午宿舍的被问的都是具体的网络知识和一道蛮难的编程题,而我这个还是比较开放性的问题,面试的jj也比较好说话。另外简历上没测试的内容貌似也不太要紧(我是基本一点都没有)。但是测试的基本原理和概念还是得知道的。


有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。


百度面试题。

 
1.

·谈谈你对数据库中索引的理解

 
R1.

使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构,例如 employee 表的姓(lname)列。如果要按姓查找特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息。

 

建立索引的优点

1.大大加快数据的检索速度;

2.创建唯一性索引,保证数据库表中每一行数据的唯一性;

3.加速表和表之间的连接;

4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

 

索引的缺点

1.索引需要占物理空间。

2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

 

唯一索引

唯一索引是不允许其中任何两行具有相同索引值的索引。

当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在 employee 表中职员的姓 (lname) 上创建了唯一索引,则任何两个员工都不能同姓。

 

主键索引

数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。

在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。

 

聚集索引

在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。

如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。

 
2.

现在普通关系数据库用得数据结构是什么类型的数据结构

 
3.

索引的优点和缺点

 
4.

session 和 cache 的区别是什么

 
R4.

Session 是单用户的会话状态。

 

当用户访问网站时,产生一个 SESSIONID。并存在于 COOKIES 中。每次向服务器请求时,发送这个 COOKIES ,再从服务器中检索是否有这个 SESSIONID 保存的数据。。。

 

而 CACHE ,则是服务器端的缓存,是所有用户都可以访问和共享的。

 
5.

如果有几千个 session,怎么提高效率

 
6.

session 是存储在什么地方,以什么形式存储的

 
R6.

session是存在服务器的内存中

每个会话对应一个sessionId

通过sessionId开区分是那个会话的session

 
7.

多人排成一个队列,我们认为从低到高是正确的序列,但是总有部分人不遵守秩序。如果说,前面的人比后面的人高(两人身高一样认为是合适的),那么我们就认为这两个人是一对“捣乱分子”,比如说,现在存在一个序列:

176, 178, 180, 170, 171

这些捣乱分子对为<176, 170>, <176, 171>, <178, 170>, <178, 171>, <180, 170>, <180, 171>,

那么,现在给出一个整型序列,请找出这些捣乱分子对的个数(仅给出捣乱分子对的数目即可,不用具体的对)

 

要求:

输入:

为一个文件(in),文件的每一行为一个序列。序列全为数字,数字间用”,”分隔。

输出:

为一个文件(out),每行为一个数字,表示捣乱分子的对数。

 

详细说明自己的解题思路,说明自己实现的一些关键点。并给出实现的代码 ,并分析时间复杂度。

 

限制:

输入每行的最大数字个数为100000个,数字最长为6位。程序无内存使用限制。

 

 
9.

考虑一个在线好友系统。系统为每个用户维护一个好友列表,列表限制最多可以有500个好友,好友必须是这个系统中的其它用户。好友关系是单向的,用户B是用户A的好友,但A不一定是B的好友。

 

用户以ID形式表示,现给出好友列表数据的文本形式如下:

1 3,5,7,67,78,3332

2 567,890

31 1,66

14 567

78 10000



每行数据有两列,第一列为用户ID,第二列为其好友ID,不同ID间用”,”分隔,ID升序排列。列之间用”t”分隔。

 

 

要求:

请设计合适的索引数据结构,来完成以下查询:

给定用户A和B,查询A和B之间是否有这样的关系:B是A的二维好友(好友的好友)。

如上例中,10000为1的二维好友,因为78为1的好友,10000为78的好友。

 

详细说明自己的解题思路,说明自己实现的一些关键点。并给出实现的伪代码实现建立索引过程和查询过程,并说明空间和时间复杂度。

 

限制:

用户数量不超过1000万,平均50个好友。

 
10.

有关系模式:User(userId, userName), Article(articleId, userId, title, content),Vote(articleId, score),User为用户关系,Article为用户发表的文章关系,Vote为文章得票关系,title为文章标题、score为得票数。

(1)用SQL语言查询所有没发表过文章的用户名;

(2)用SQL语言查询得票数大于100的所有文章标题,按得票数倒序排列;

(3)用SQL语言查询出发表文章数大于5,文章平均得票数大于100的用户名,按平均得票数倒序排列;

(4)设计这些表的主键、外键和索引,并指出上面三个查询所使用的索引。

(5)当用户数超过1000万,文章数超过1亿时,如何考虑存储及性能的改进和优化?

 

 
11.

每天论坛访问量300万左右,更新帖子10万左右。

请给出数据库表结构设计,并结合范式简要说明设计思路。

 
R11.

这是我看见的百度面试题,以前也在cdsn上面看见过类似的问题,没有仔细想就写了自己的见解和答案,很可惜我以前的想法是错误的;算是误人子弟阿,郁闷!因此我还是先把和几个朋友讨论的结果和自己的想法做一个总结,算是弥补我以前想法造成别人曲解的过错; 首先,我们先来分析一下这道面试题:用户名,email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容。这些字段可以基本归为三类:

 

1、用户基本信息:用户名(UserName),email(Email),主页(HomePage),电话(Tel),联系地址(Address);

2、发帖主题信息:发帖标题(Title),发帖内容(Content);

3、回复信息:回复标题(RTitle),回复内容(RContent);

 

以上一步有基本开发经验的人都知道,只是对基本的信息进行划分;相信将用户基本信息存放在一张表内不会有什么好讨论的,我创建一张表叫T_Users,并建立主键UserID,用户基本信息所需要存放的内容都放置在此表内;那么是应该把发帖主题和回复信息分别创建两张表存放数据呢还是应该存放在一张表内?字段内容还是比较接近的,因此从数据冗余的角度看,一张表和两张表在此方面的区别并不影响设计;假设按照大多数论坛的设计思路,将2、3设计成两个表T_Topics和T_Reverts后,再来分析看看是否合适这里的要求;

 

现在“每天论坛访问量300万左右,更新帖子10万左右”对这句话进行分析,才是这个面试题的关键所在。面试题显然要求在操作数据库的性能方面要有更高的要求。而对数据库的操作而言,检索数据的性能基本不会对数据造成很大的影响(精确查找的情况下),而对表与表之间的连接却会产生巨大的影响,特别在有巨量数据的表之间;而对数据库的连接也是相当消耗性能的操作(这在ADO.NET的教程中都多次提醒的);因此对问题的定位基本可以确定:在显示和检索数据时,尽量减少数据库的连接以及表与表之间的连接;

 

解决问题的指导性原则找到了,那就来看看,从上面的设计中,有哪一些地方会产生我们提到的表与表之间的连接;(连接数据库的次数尽量减少到每打开一个页面只连接一次数据库就可以得到所有的数据)1、用户基本信息中的用户名在发帖主题列表以及打开一个主题查看回复内容时上面会有所显示,需要在T_Users和其他两张表进行连接;2、在打开一个主题查看回复内容时,需要在T_Topics和T_Reverts之间进行连接;其他应该是不需要产生表与表之间的连接;按照面试题来推测:T_Users的数据量应该在1万-10万之间,T_Topics应该在100-1000万之间,T_Reverts应该在1000万-1亿之间;从上面两类连接可以看出来,T_Users和T_Topics会在列表页面连接一次;T_Users、T_Topics和T_Reverts三张表会连接一次;

 

我说不上来第一种连接是否可以允许(至少在我开发的系统里面都是允许的),但是另外三张表连接是绝对不会允许的!特别是T_Topics和T_Reverts两表之间的连接会产生很大的性能损耗,因此需要避免这样的情况产生。那怎么样的设计可以避免T_Topics和T_Reverts两表之间的连接呢?前面已经进行了分析:可以考虑把发帖主题和回复信息存放在一张表(T_Infos)里面,看看是否可以解决这个问题;我们设计一个字段(Flag)来标记是主题还是回复的内容;设计一个字段(ParentID,主题此字段为ID值)来指定是哪一个特定主题的回复;在开打回复信息时,只需要按照所知道的主题ID,就可以检索到这个主题的内容以及所有的回复内容,上面指出的问题就可以解决!

 

为了性能,我们再一次对T_Users和T_Infos连接对性能的影响进行一下细致的分析,可以通过在T_Infos表内增加UserName字段来解决和它的连接,这样至少在显示时,性能能够得到保证;但是这样的设计因为UserName字段是冗余的,因此在用户修改UserName的时候就会产生同步数据的问题,这个需要程序来进行弥补,并是我们认为用户不会经常性的修改他的用户名这样的前提下;

 

因此这道面试题的答案应该是设计两张表,用户基本信息表T_Users和内容表T_Infos,这两张表的连接还是通过UserID,但是T_Infos中增加UserName这个字段来增加性能!

 

上面的面试题算是分析完了,但是从这道题目的分析中我们可以看出来,这样的设计是建立在“一个简单的论坛系统”这样的基础上的极端事例,在我们真实的世界中,不太会有很多的人喜欢这样简单的论坛,而且这样的论坛在扩展性方面会产生很大的限制;这算不算这道题目是应试教育的产物呢?而且在设计的时候不仅仅是为了适应现在系统的需求还需要提供将来新的要求的变化,因此在实际的开发过程中间并不推荐使用这道面试题的答案。

 
12.

给你a、b两个文件,各存放50亿条url,每条url各占用64字节,内存限制是4G,让你找出a、b文件共同的url。

 
R12.

可以估计每个文件的大小为5G*64=300G,远大于4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。

遍历文件a,对每个url求取hash(url)%1000,然后根据所得值将url分别存储到1000个小文件(设为a0,a1,...a999)当中。这样每个小文件的大小约为300M。遍历文件b,采取和a相同的方法将url分别存储到1000个小文件(b0,b1....b999)中。这样处理后,所有可能相同的url都在对应的小文件(a0 vs b0, a1 vs b1....a999 vs b999)当中,不对应的小文件(比如a0 vs b99)不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。

比如对于a0 vs b0,我们可以遍历a0,将其中的url存储到hash_map当中。然后遍历b0,如果url在hash_map中,则说明此url在a和b中同时存在,保存到文件中即可。

如果分成的小文件不均匀,导致有些小文件太大(比如大于2G),可以考虑将这些太大的小文件再按类似的方法分成小小文件即可。

 
13.

给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词。 (这道题面试官说有O(1) 的解法,。。。。。)

 
R13.

 

使用hash_map和链表。

首先定义一个key,使得兄弟单词有相同的key,不是兄弟的单词有不同的key。例如,将单词按字母从小到大重新排序后作为其key,比如bad的key为abd,good的key为dgoo。

使用链表将所有兄弟单词串在一起,hash_map的key为单词的key,value为链表的起始地址。

开始时,先遍历字典,将每个单词都按照key加入到对应的链表当中。当需要找兄弟单词时,只需求取这个单词的key,然后到hash_map中找到对应的链表即可。

这样创建hash_map时时间复杂度为O(n),查找兄弟单词时时间复杂度是O(1)。

 

//////

 

只要定义一个合适的特征码,然后用hash结构保存,就可以达到O(1)的解法。

比如:对单词aadb 定义特征码如下a2b1d1, dddabc的特征码是a1b1c1d3,以此类推(各位大侠可以设计更好的特征码)。

数据结构定义如:hash_map >,其中hash_map的key是特征码,value是兄弟单词集。首先扫描字典,将所有单词的特征码和相应单词集装入这个数据结构。

查找时,先计算出待查单词的特征码,然后搜索一下hash_map里相应set的大小,就知道有多少个兄弟单词了。
14.

五桶球,一桶不正常,不知道球的重量和轻重关系,用天平称一次找出那桶不正常的球。

 
R14.

这个问题的解法如下(首先假定只要不把球从天平拿下来就还算一次,另外每个桶内的球是一样的):

1)从1号和2号桶各拿一个,放上天平(1号左,2号右),如果平衡,说明这两桶球都是正常的,可以做为砝码。如果不平衡,那么1号和2号桶必有一个不正常,而其他3,4,5桶是正常的,可以作为砝码。

2)首先考虑1号2号桶不平衡的情况,这时从1号和3号桶再各拿一个球,放上天平(1号右,3号左),如果这时平衡了,说明1号桶是不正常的,如果还是不平衡,那么2号桶是不正常的。

3)如果第一步1号2号桶是平衡的,那么也好办,把3,4号桶各拿一个放上天平(3号左,4号右),这时如果还是平衡的,那么5号桶必然是不正常的。如果不平衡,说明不正常的就在3,4号桶之中。我们再用2)的方法找出来即可。


1 完成函数
size_t foo(unsigned int *a1, size_t al1, unsigned int* a2, size_t al2)
其中a1和a2都为无符号数组,al1和al2为数组的长度,数组的长度为偶数。
无符号数组由一对数字区间组成。如下例:
a1 为 0,1,3,6,10,20
a2 为 0,1,20,50,4,5
则 a1表示以下区间[0,1] [3,6] [10,20]
a2表示以下区间[0,1] [20,50] [4,5]
则a1,a2的重叠部分为[0,1] [4,5],其长度为2
函数foo要求返回重叠区间的长度。上例中为2.

要求:
详细说明自己的解题思路,说明自己实现的一些关键点。
写出函数foo原代码,另外效率尽量高,并给出代码的复杂性分析。
限制:
al1和al2的长度不超过100万。而且同一个数组的区间可能出现重重叠。
如a1可能为 0,5, 4,8, 9,100, 70,80
使用的存储空间尽量小。


2 多人排成一个队列,我们认为从低到高是正确的序列,但是总有部分人不遵守秩序。如果说,前面的人比后面的人高(两人身高一样认为是合适的),那么我们就认为这两个人是一对“捣乱分子”,比如说,现在存在一个序列:
176, 178, 180, 170, 171
这些捣乱分子对为<176, 170>, <176, 171>, <178, 170>, <178, 171>, <180, 170>, <180, 171>,
那么,现在给出一个整型序列,请找出这些捣乱分子对的个数(仅给出捣乱分子对的数目即可,不用具体的对)

要求:
输入:
为一个文件(in),文件的每一行为一个序列。序列全为数字,数字间用”,”分隔。
输出:
为一个文件(out),每行为一个数字,表示捣乱分子的对数。

详细说明自己的解题思路,说明自己实现的一些关键点。并给出实现的代码 ,并分析时间复杂度。

限制:
输入每行的最大数字个数为100000个,数字最长为6位。程序无内存使用限制。


二、下面是两道选做题,请根据自己的情况选择其中的一道作答(WEB方向请答第4道,其他职位方向答第3道)。

3
考虑一个在线好友系统。系统为每个用户维护一个好友列表,列表限制最多可以有500个好友,好友必须是这个系统中的其它用户。好友关系是单向的,用户B是用户A的好友,但A不一定是B的好友。

用户以ID形式表示,现给出好友列表数据的文本形式如下:
1 3,5,7,67,78,3332
2 567,890
31 1,66
14 567
78 10000

每行数据有两列,第一列为用户ID,第二列为其好友ID,不同ID间用”,”分隔,ID升序排列。列之间用”t”分隔。


要求:
请设计合适的索引数据结构,来完成以下查询:
给定用户A和B,查询A和B之间是否有这样的关系:B是A的二维好友(好友的好友)。
如上例中,10000为1的二维好友,因为78为1的好友,10000为78的好友。

详细说明自己的解题思路,说明自己实现的一些关键点。并给出实现的伪代码实现建立索引过程和查询过程,并说明空间和时间复杂度。

限制:
用户数量不超过1000万,平均50个好友。

4
有关系模式:User(userId, userName), Article(articleId, userId, title, content),Vote(articleId, score),User为用户关系,Article为用户发表的文章关系,Vote为文章得票关系,title为文章标题、score为得票数。
(1)用SQL语言查询所有没发表过文章的用户名;
(2)用SQL语言查询得票数大于100的所有文章标题,按得票数倒序排列;
(3)用SQL语言查询出发表文章数大于5,文章平均得票数大于100的用户名,按平均得票数倒序排列;
(4)设计这些表的主键、外键和索引,并指出上面三个查询所使用的索引。
(5)当用户数超过1000万,文章数超过1亿时,如何考虑存储及性能的改进和优化?


一、选择题:15分 共10题
1. 任何一个基于“比较”的内部排序的算法,若对6个元素进行排序,则在最坏情况下所需的比较次数至少为____。
A.10 B.11 C.21 D.36

2. 关系模型有三类完整性约束,定义外键实现的是 完整性.
A. 实体完整性 B. 参照完整性
C. 用户定义的完整性 D. 实体完整性、参照完整性和用户定义的完整性

3. 64位linux系统和机器,int类型、long类型分别占用多大的空间(字节数)
A. 4,4 B. 4,8 C. 8,4 D. 8,8

4. 下面说法正确的是:
A. 根据gprof统计的程序运行时函数调用次数及执行时间,进行程序代码优化,这是amdahl定律的应用
B. 计算机网络设备的缓冲区是时间和空间局部性原理的应用
C. 局域网内的计算机发送数据包的数学模型遵循泊松分布
D. 分支预测使用先前运行时得到的配置文件,这是依据正态分布

5. 下列叙述正确的是:
A . #define fun(x,y) (x/y)
Int I = fun(2+4, 3);
I 的值为2
B.var++ 与 ++var 没有区别
C.C++程序,抛出异常时,一定会发生异常对象的拷贝过程
D.quick sort 是一种稳定排序。

6. 上下文无关文法是一种____。
A 左线性文法 B 右线性文法 C 正则文法 D 以上都不上

7. 关系表达式 !(A&&(B||C)) 和下面哪个表达式表达的意思一致:
A (!(A&&B))||(!(A&&C)) B (!(A&&B))&&((!A)||(!B))
C (!(A||B))&&(!(A&&B)) D (!A)||((!B)||(!C))

8. 设int x=4; 则执行以下语句: x+=x-=x-x--;后,x的值为
A. -1; B. 5; C. 7; D. 11;

9. 以下IO函数中,哪个是流式IO函数()
A、read; B、fread; C、mmap; D、recv;

10. 已知:
struct st
{
int n;
struct st *next;
};
static struct st a[3]={1,&a[1],2,&a[2],3,&a[0]},*p;
如果下述语句的显示是2,则对p的赋值是____。
printf("%d",++(p->next->n));
A. p=&a[0]; B. p=&a[1]; C. p=&a[2]; D. p=*a;

二、简答题:20分,共2题

1. (10分)已知某种线上服务存在3种异常D1, D2, D3,根据每天在固定时间段长期人工监控的统计结果,3种异常的发生率是:D1 0.28%, D2 0.12%, D3 0.32%。现开发一种监控程序,分别对这三种异常做监控,如果发现某种异常就发出相应报警。记无异常为D4,无报警为A4。在各种异常情况下发出报警的 溉率如下表:
D1 D2 D3 D4
A1 0.90 0.06 0.02 0.02
A2 0.05 0.80 0.06 0.01
A3 0.03 0.05 0.82 0.02
A4 0.02 0.09 0.10 0.95

请评价该监控程序的敏感性和正确性。

2. (10分)以下是一个常驻内存的C程序,请问程序中有什么问题?
int f(int number)
{
FILE * fp;
char file_name[20];
int sum=0;
for(int i=0; i {
if(0==i%30)
{
sprintf(file_name, ”file_%d.txt”, i/20);
fp=fopen(file_name,”r”);
if(fp==NULL) return -1;
}
sum += i;
}

fclose(fp);
return sum;
}

三、编程题:30分 共1题
注意:要求提供完整代码,如果可以编译运行酌情加分。

1. 一条1百万节点的单向链表,链表所有节点是按value字段从小到大的顺序链接;下面是一个节点的结构
typedef struct node_t{
int value; /* 节点排序字段 */
int group; /* 组号: 0,1,2,3,4,5,6,7,8,9 */
struct node_t *pnext; /* 下个节点的指针 */
}node_t;
node_t head; /*该单向链表的头节点,全局变量 */

试设计程序:针对各个group(0-->9),根据value字段排序,输出各组top 10的节点。(top10是从小到大,取后面的大值top10.)
要求:尽量减少计算复杂度、遍历次数,不允许大量的辅助内存

四、设计题:35分 共1题
注意:请尽可能详细描述你的数据结构、系统架构、设计思路等。建议多写一些伪代码或者流程说明。

1. 设想网络上的一个发送者和64个接收者,发送者每秒有不超过128条的命令产生,每条命令包含一个512字节的头部command_head_t和至多4K字节的变长内容。command_head_t的结构如下:
typedef struct {
int cmd_no; //该命令的命令号,唯一识别一个命令
int version; //产生该命令的程序的版本
int detail_len; //变产内容的实际长度
char *content; //指向变长内容的指针

} command_head_t;
发送者根据命令号将这些命令分别发送给接收者去处理,例如:发送者产生c1,c2,c3,c4命令,并设定将c1,c2命令发送到接收者r1和r2,将c2、c3,c4命令发送到r3。
接收者执行接收到的命令,并相应修改自己的状态。
现在的问题是:在尽可能多的考虑各种可能的意外情况下(包括但不限于网络故障、传输错误、程序崩溃、停电…),如何设计命令的存储、发送、接收的流程,以保证命令的:
1) 传输中的有序、无漏、无重复性
2) 整个过程中命令和数据的正确性
3) 多个同一类型的接收者(例如r1与r2)的状态可以在有限时间内趋于一致
最后,请针对你考虑到的意外情况,说明所采用的避免、解决或恢复方案。


三个警察和三个囚徒的过河问题
  
  三个警察和三个囚徒共同旅行。一条河挡住了去路,河边有一条船,但是每次只能载2人。存在如下的危险:无论在河的哪边,当囚徒人数多于警察的人数时,将有警察被囚徒杀死。
  
  问题:请问如何确定渡河方案,才能保证6人安全无损的过河。
  
  回答:
  
  警察囚徒过去,警察回来
  
  囚徒囚徒过去,囚徒回来
  
  警察警察过去,警察囚徒回来
  
  警察警察过去,囚徒回来
  
  囚徒囚徒过去,囚徒回来
  
  囚徒囚徒过去


1、给你一组离散的点集合S和一个坐标P,在S中找到一个点使其到给定点P的距离最短;(要求:不能求两个点之间的距离)

2、任意给定平面上n个点的坐标,要求你确定一个圆,将这个n个点平均分为两部分,其中一部分在圆的内部,另外一部分在圆的外部,这个圆不一定是唯一,只要输出其中一个圆的圆心和坐标就可以了。(要求:不能求两个点之间的距离)



为某图书馆开发在线浏览系统,使用户可以通过自定义的图书别名浏览相关联的图书  
内容。假设该图书馆有1000万注册用户,馆藏图书1000万部。在线浏览系统允许用户自  
定义分类名称,每个分类可以包含若干部书籍。用户可以添加、删除分类,修改分类的  
名称(同一用户不允许有名称相同的分类),可以在分类下添加、删除书籍,修改书籍  
的别名(同一分类下不允许有名称相同的别名)。现在设定每个用户最多可以自定义10  
0个分类,每个分类最多可以包含100部书籍。   
A、假定用数据库解决存储问题,请设计相关的数据表结构,并给出设计考虑。   
B、请给出下列操作的SQL语句   
   展示用户A的所有分类   
   展示用户A所设置的分类F下的所有书籍信息   
C、请根据题目A的结果,尝试分析一下当用户数目增长到1亿,馆藏图书达到10亿册,每  
天访问用户达到500万,平均每人有10次操作时,系统应当做哪些改进或优化。


2011-1-9 20:42
满意回答

该图书馆有1000万注册用户,馆藏图书1000万部。在线浏览系统允许用户自  
定义分类名称,每个分类可以包含若干部书籍。如书架名、书名号接下去为代码加上自己的代号就行。


你可能感兴趣的:(C面试,Android,面试)