工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1212|回复: 0

[面筋] 整理的百度面经

[复制链接]
发表于 2011-6-28 10:40 | 显示全部楼层 |阅读模式
整理的百度面经
2 [3 h! U! Q0 @6 f& W8 R* t4 I; ]  C( \: K( q* ~
zz- w& ]+ ^# O/ U! T' s6 _3 w2 \

& m  r! i5 o( T$ v* @3 X; b* p! P3 }9 x& q: s
一面1. 网络编程经验:1 T  k/ K+ ]" B4 m' c
   如何判断一个http请求,一个客户端请求已经结束;如何处理服务器多线程! q- @! K7 b  }1 Q2 P! m2 v
   获得一个http请求后,是如何处理的?返回什么?有没有试过返回图片?
, [9 L7 {1 L/ t   服务器给客户端请求时,是用什么函数写?服务器如何获取客户端请求,用什么函数* d  _- u7 }) G, w9 C4 _3 a
   (需要函数级别的连接有一个认识)% b- V# c* t5 G- J
' U! j, a# \# e, E* Q6 D# Y
2. cv操作是什么函数 cv_init, cv_wait, cv_signal+ y5 @0 J1 U  D5 V! C7 d

% o1 ~7 ^: j( h# E3. 有一些关键词点击次数的文件,如何输出最多点击的一百个(当时应该回答,组织一个100个元素的最大堆)
1 n: a6 s: e) i/ @
( J  |* \$ [# c& j$ g* J/ ~4. 相交链表,如何找相交点(不能要标记)9 H( \6 g( y; l+ Y* }' g2 L1 e
   第一个头遍历到尾,知道他的长度;第二个头遍历到尾,知道他的长度。这样知道两截链表在交点前的长度,长的先走几步,然后一样长了,再轮流下走,就会相聚,相遇节点就是相交节点)
4 {' ~; Z% U  X) D" R' W$ ~) }& K1 A0 P! r' s
5. 有些文件,频繁访问在磁盘里头的,现在要放到内存中了。采用什么策略来决定哪些放到内存中?如果是一些url文件,放在内存后,如何快速的找到某个url的位置(采用字典序或者b树之类树状结构来组织) 如何快速找到哪些文件太久没人访问了,把他替换出去?(再那一棵树,记录树里每个位置url的访问时间;同时,那个url树的节点,也有这个时间树的对应的位置信息。时间树采用最大堆组织。要替换出去时,就从树顶取走节点,并且从中获得这个节点在url树对应位置,把他从url树中取走。当url被访问时,由于url树节点有时间树的位置信息,所以也很快找到对应节点在时间树的位置,然后把他的访问时间更新,然后做堆调整,每次堆调整为logN)
$ W* L8 J2 F; @4 R- |
; X! k. z) R: Z& ~9 v6. c语言相关:内联函数的好处?非内联函数被调用的过程是怎么样的?: o7 u2 q8 B1 O/ C9 G" e) p: R
   int,short,char的struct,这几个数应该怎么放,内存小?怎么防止头文件被include多次?
1 }) m; {0 [& |. F: m
- E) C9 j5 N- s7. 有没有什么问题想问的$ w, d. g% s2 `0 h, r# m- w
8 linux 网络查看的命令6 A0 k/ I$ y. m7 i( u% W

; c4 z1 x, E) l9 [" [二面
1 h3 R# i$ g- q1. 介绍一个项目/ R# V( c( I# ^' r" K

9 S/ w% _- l( j7 [2. 2.5亿个int数,可能有相同的。统计出这里头不同的数有多少个?只有2g内存。% h+ g' k( S7 h3 N7 |+ |9 m# c0 W8 x
(2.5*1000 000 000 * 4 =1G)
, f$ k8 Y3 S% |, l+ B$ I$ c统计数-用hash,key是数,value是1或0,标记是否出现。
8 X: k3 i" {. B, g如果key就是那个数,那么找一个数的时候,要遍历hash才知道有没有,慢(就是如果hash紧凑,慢)。2 W0 B' _( R6 l0 D
解决方案:把key作为连续的(就是hash是稀疏的,有个key值没有存在这2.5亿个数中),像数组下标一样,那么要访问第n个数,直接到第n个去看,复杂度是O(1)& W3 [. Y: o7 U7 ^; W7 k2 y, _
但是,如果连续,2.5亿个数,范围很广,而每个key用int存,会很大量,内存不一定够。! u+ \5 v  A' E- G7 r
解决方案:每个key用一位bit来标志。即数字1放在第一个bit上,数字2放在第二个bit上。看第n位在不在,就找一下第n个bit是1,还是0
. [4 o" R; n- Y2 }$ f具体方法:char a[] 数组。假设找3,那么3在3/8--0...3,所以在a[0]中,找第3个bit,如果是0,就设置为1。最后看看a[]的二进制表示有多少个1就有多少个数3 B& }! _/ ~* ^2 G. F1 z9 A1 @6 W( X" W
' L0 V2 s# W3 n& `
3. 海量数据,在mysql中,cpu占用率很高。如何解决?& M1 h" @6 x+ I+ B# [
1.show processlist,看哪个sql查询的多,建索引(问:建立联合索引时,要考虑什么,怎么建(哪个在前,哪个列在后?)$ V/ x" ~6 ?0 T/ b+ ~8 X
2.如果老是在拷贝到临时表,就改配置,把临时表内存改大些% s3 K' g/ u8 p5 W# R0 n" W
3.还有什么方法:2 |9 B/ H0 V8 k& [' h0 Y( m
1)分布式数据库 (问:如果你来设计分布式数据库,你会怎么设计?)
' X2 n7 o6 [# }$ ?) h, o  T2)使用缓存   (问:如果缓存中的数据,被删除或跟新了,数据库怎么判断这个缓存的数据不能用了,是脏数据?)(不懂)( J% o7 Z& P- |) i
问:什么情况下cpu会高?(内存不足)为什么内存不足cpu会高(频繁io读写)
% r# N$ G1 N! d
8 X$ H: f% j  D7 v, v4. n个无序int,(有正有负),给一个数v,如何找出其中的a+b=v的两个数; [+ n; _3 L4 w" Y  b
(我的答案是:排序 O(nlogn),记录序列中,0,大于v,小于v的3位。+ ]! E8 p- y& |
尝试最小的和最大的,最大不行,次大。。。,找到某个,加起来小于v了,停止: k( {: ?# I# d: ^  ^5 Y/ ?
尝试次小的,从上次大头停止的位置开始尝试
  k9 U) N, z' `( G0 h" X---尝试范围两头不断缩小,复杂度为n)
% ]# u% v" ~( ~1 M, q. c, ~* q1 o. P$ c1 k
5. 网络相册,一个人可以有多个相册,一个相册有多个图片,如何快速实现增删查移动等操作。web页面上,图片是翻页显示。
) a* X  G2 d" C9 X2 m5 x' g(我回答:数据库记录:usr_id, book_id, item_id, position。相片放在磁盘上,目录为position/usr_id/book_id/item_id! ?9 n  O% u. J. Q3 B
一次查两个操作:1)数据库查找2)根据位置取图片9 t  r. x( H1 |- N) e2 m

  \6 }, |, K9 d, [5 M如果用户提取某个相册的所有图片,先给他第一个相片和所有item_id列表。然后用户翻页了,在客户端通过javascript能够知道翻的是哪个item,把item_id,book_id, usr_id发给服务器,服务器根据这个到目录下去找)
7 {0 h1 P7 {  }5 f! `(你这种设计会有什么问题?(答不上来。。。)(如果用户频繁翻页,那么服务器上会不断地在传输图片)(如何解决?)
3 x  A0 x( F& s* \" a/ x1 m$ v& @+ ?) b% L7 a
第五题我想不出好办法,我觉得一般他们都show thumbnail
0 F$ ]4 R1 \& |0 }  C5 ?) N就是预览小图片不把原始图片show在页面上,点击后才能看单个图片* e9 K( N. I2 e

, f7 C8 _! ]6 q5 p- F  g: E* G6 s) b1 p# Y! f
6. Unix系统里,一个简单的print hello world的c程序,从./a.out执行到屏幕打印出来这句话,是什么过程
  m+ R9 A& T4 |6 {(1.读elf,会从相对地址,计算出各个symbol的在进程中的绝对地址。然后找到入口main函数
. [/ J( ]8 |+ M" _6 L  1.用到std的库,所有有run time load。
  ~9 @# f& L4 E: P3 g  2.然后是print调用的进栈
! h% X, r) s2 S2 {' l, G, h( |  3.然后是系统调用,当前进程被挂起。系统调用会调用驱动。。。(内核切换,用户态到内核态)1 E3 Y* M; F$ T+ w" G
  4.内核处理完再唤醒当前进程。(切换)
0 t5 [- E4 r3 ~" o9 B% U  5.print调用完毕,退栈. c) O) b  W% U; G/ \
  6.main函数退栈
8 r" d1 d  R- x) ^5 S3 P) k/ |3 k$ q7 I8 Q5 E7 o: T+ T6 O
问:哪个进程来调用的main?(不知道)
  C; g" S7 b" I* g- F应该是当前运行a.out的这个和用户交互的shell作为父进程,然后父进程fork子进程,子进程和父进程一样,然后调用execv会load执行文件,和把参数传到main的堆栈中, D- K" W% q$ `
+ r2 e; r+ @4 I$ a- S
7.socket编程,要注意什么问题0 k. w6 }( j' b: e
(服务器的serversocket的基本模型。( l1 ^+ |% P# T7 }; ~
但是大量请求,会不能及时响应。所以要多线程。
0 {+ ^8 w1 R: X- u% ^一个监听线程,多个服务线程。服务线程一开始起来都阻塞在存放请求socket的tasklist上。wait, M$ Q! |( d5 ?, ]8 y. i
监听线程接受到client的socket,放入tasklist中,signal唤醒一个服务线程。服务线程处理它,并把它从list中移走
% u1 l) ^8 B2 p- N% J& u注意问题:tasklist的存放的请求socket是会被放和移走的,消费者生产者问题。所以要synchronized来互斥?)6 L# a9 Y4 K: u9 E7 Y, i6 B. o
1 h$ t. F6 F+ B$ N+ Z  e8 y8 Q( U
三面5 s0 x9 T4 e$ k5 Q+ ^1 D

& r9 b9 P2 h# T8 d/ |3 |# J
- P7 ]4 k, l1 G: {- u) l) \2. fread的过程(文件系统-内核。。。)
! P6 p7 H8 w% Z8 g" N3. 主DB在接到数据更新后同步到后台DB,如何避免网络丢失之类的问题7 l0 u, x$ d8 r; Q2 d
(参考答案1:传的是sql语句,接到后回ack,如果主DB发现一段时间没有回,重发;其实TCP传输,就保证了不会漏数据,所以不会考虑这个问题的)) T+ k9 p( Q- P, {  t0 a
(参考答案2:每次传sql语句和当前版本号,然后后台DB会对比版本号是不是正确,发现落后就发数据请求。主DB保留每次版本号更新关联的sql语句)$ X+ Y4 R3 L6 M; b+ k
4. N个bit,如和判断其中有多少个1.(时间复杂度小于N)
& o: u! d( B& W# F% ]/ T预存一个2的8次方大小的数组,每个数组值是,这个下标的数的二进制的1的个数,例如:- o2 m9 W6 L8 a2 \3 v- W/ L
a[0]=0, a[1]=1, a[2]=1,a[3]=2....a[2^8-1]=7 (以空间换时间)& k7 ?" R9 `1 t5 M' o2 L* K6 K
( }! e- x" f4 x# Y
然后一个byte一个byte的读,看看他的值,直接以这个值为下标去数组看他的1的个数+ W. y6 W; ?# Z8 `# O/ `
$ J( t; ~4 D/ h6 I3 A: y
4 F8 b7 S  Z' @4 e, a! b) U
另一个方法:0 J( n9 U% \* W# _
# `2 C) a2 S9 ?+ p9 z8 \5 L, w
while(v){: ~6 \+ g; |# J- S: ^+ D; q
v &= (v-1);
/ f! P0 e0 M, R  [% z2 wnum++;
, H$ A. k7 H8 R4 w3 X  T. {, F}/ I) E$ \  c3 k) m5 ~
1000 & 0111 = 0, 所以每&一次,不为0,说明有1个1,&到为0为止,num就是1的个数。复杂度为1的个数。
8 o' H' \: Z( M! c; k
4 L, o+ g8 W' t8 Q1 PZz: f7 B" }3 y9 y
该内容转载自网络,版权归原作者所有。4 j4 N: Q0 P. P0 z7 l
0 O1 i7 v! f: z5 K
……% o( i7 {$ p6 i5 U
http://bbs.aftjob.com/thread-164201-1-1.html
8 }" l- d% H& ]/ Z- R# |; \
; L* a) }2 i4 N3 Q6 w* @% g* [; D+ _, @4 K/ X  ^( o" N( W# Z" y5 L
百度(Baidu)求职俱乐部
. }1 B% b1 C9 l  I+ U4 v, V* chttp://bbs.aftjob.com/group-4-1.html% Z. }  e! h1 p' e( Y2 g: e% d
" T: M2 ?. [. P: i3 c+ {5 q/ W
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-5-17 06:08

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表