百度11月4日网上笔试题及答案(仅供参考)
转自:http://yingjiesheng.com/file/info/3983.html
1编程: # ,sW5~)I
KC|M=SQ
用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。 Fv4$ D#V
1*?i
2 编程: K|Ga#U:{y
F?9'j*5F6
用C语言实现函数void * memmove(void *dest,const void *src,size_t n)。memmove T 26l5 ::A
# Qrvd+T
函数的功能是拷贝src所指的内存内容前n个字节 ;> q.[Gm
ZCK)%u
到dest所指的地址上。 Ap "]T>*.
'-W -Iv^
3 英文拼写纠错: |( di[lEPv
UR g//M
在用户输入英文单词时,经常发生错误,我们需要对其进行纠错。假设已经有一个包 v9rh@k}ez:
Wa,XX@f!'
含了正确英文单词的词典,请你设计一个拼写纠错 "bj}x'#_G
@h3N <Fy
的程序。 to4ac+_
<Q8Xm} k
(1)请描述你解决这个问题的思路; -cOYu,Qh
H8=+ }`
(2)请给出主要的处理流程,算法,以及算法的复杂度; hwkUI.;k*
pB*Y(U
(3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。 k~_%-`m&
*x# @?
4 寻找热门查询: g7! }U #
VC"^=F:cs
搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串 "Ejed/Z
w eYjy[Cx
的长度为1-255字节。假设目前有一千万个记录, P8gLh]9_!
uxq|"{o|
这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个 kXyR
ShnMmnj
。一个查询串的重复度越高,说明查询它的用户越多, "Wo!D.op-
G^>f~D
也就是越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。 TQ_ZwNIn
f`,eW Zk.
(1)请描述你解决这个问题的思路; zu5 6|
A2uG/jHYD
(2)请给出主要的处理流程,算法,以及算法的复杂度。 10P/;(=|
d@(n6#x+/
5 集合合并: ?Dk(%,d"q
d_B|r5Y ~i
给定一个字符串的集合,格式如: 0+goY"?)
g'QT[E
{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh} yM20jG
f M:7[%/
要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应 lU0=fVJo
F )8g2&"T
输出 Ry2 DG3W
W1'u E
{aaa bbb ccc ddd hhh},{eee fff}, {ggg} CsT8
{Mg*$9R
(1)请描述你解决这个问题的思路; >=I d0a`
LB{RP
(2)请给出主要的处理流程,算法,以及算法的复杂度 jz@QU(m
-tD!&Pdh
(3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。 +tK6B4{
BC9^& M
1 (+]qL3
_EV!M^^9$
1 题 RCXo l
u2A~ tGd
char *revert(char * str) fELmK]OX
(~Hx sq"
{ qpCS# J
xi.M el3
int n=strlen(str); H9C7y')^
Ar -jg
int i=0; S"!U|7o
4FEttiVS^
char c; O>4cxdB5
4 BEa5z-2
for(i=0;i; `~nP'ps-D
= QU9:%MB
str=str[n-i]; SbJ(XkEDR
X2>S@:/
str[n-i]=c; m 1Y_]B
j!& cW+B,t
} -``F#:3
m6ovR#v
return str; l&eLla|/m
px^rE^?^
} d(Rv~OVlD
#|v]p' 2@<
/// 74&+x{2L
46KW1zs
2 题 19(Das[
9%v ]og
void * memmove(void *dest,const void *src,size_t n) I. _ ' Y1
0&zY)({%~
{ /k&`7<:
Y8&c;|u
assert((dest!=0)&&(src!=0)); Ng ?u?_(
JI Bo1AKJ
char * temp=(char * )dest; )F,xx,#>
/1xz>9-}
char * ss=(char * )src; +ZSrr3~2`m
wIk:FwwF]
int i=0; /X{ v
a}(prB6R
for(;i若存在,则将此小集合与大集合合并,并根据大小插入对应的位置 。转3 oVO{@WE4
2vwQN aE L
。 p;59kyKDil
!uZf8w|
2>若不存在,则在该集合中取下一个元素。如果无下一个元素,即所有元素 I=)LM.J
fTa8rHK*b
都不存在于其他集合。则表明此集合独立,从待处理集合列表中删除。并加入结果集 ?r77o
rM]w6;(|
合列表。转3。 mj U7/SO
WI=NU cKy
3。如果待处理集合列表不为空,转2。 u V&|"R|%%
9^'~;i=
如果待处理集合列表为空,成功退出,则结果集合列表就是最终的输出。 2mT^L<GO
OSh&PL~
算法复杂度分析: 7D )}D#
c,*Wgsw1
假设集合的个数为n,最大的集合元素为m 0qn{=heg}
&Qi4. Gwo
排序的时间复杂度可以达到n*log(n) 2!XsRdn^p/
[{vgvI)Zd
然后对于元素在其他集合中查找,最坏情况下为(n-1)*m y5@Rgkc,y
Wll!z_1Z{
查找一个集合是否与其他集合有交集的最坏情况是m*m*(n-1) ZtfC5
NIU7cX}3
合并的时间复杂度不会超过查找集合有交集的最坏情况。 ! n=z3fE
NZmQ~f$'r7
所以最终最坏时间复杂度为O(m*m*n*n) IU!*ujk
H=sNT_SC/
需要说明的是:此算法的平均时间复杂度会很低,因为无论是查找还是合并,都是处 }pj9 yx
KP& ,e|R
于最坏情况的概率很小,而且排序后优先用最小集合作为判断是否独立的对象,优先 =@gG]gHY
-Off#h zK
与最大的集合进行比较,这些都最大的回避了最坏情况。 .jiu%G n'
Kr^/~b-B
(3)可能的改进: ZC>F2MBo
7t6T)!?"I
首先可以实现将每个集合里面的字符串按照字典序进行排列,这样就可以将查找以及 E)O7Rsu(:
WQ]9CRb67
合并的效率增高。 b-IW*IXo
n|5b!G
另外,可能采取恰当的数据结构也可以将查找以及合并等操作的效率得到提高。
***************************************************************************************************
***************************************************************************************************
一、选择题:15分 共10题
1. 任何一个基于“比较”的内部排序的算法,若对6个元素进行排序,则在最坏情况下所需的比较次数至少为____。 A
A.10 B.11 C.21 D.36
2. 关系模型有三类完整性约束,定义外键实现的是 完整性. B
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. 下列叙述正确的是: C
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<number; 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)的状态可以在有限时间内趋于一致
最后,请针对你考虑到的意外情况,说明所采用的避免、解决或恢复方案。