找回密码
 加入后院

QQ登录

只需一步,快速开始

搜索
查看: 1460|回复: 0

[面筋] 整理的百度面经

[复制链接]
发表于 2011-6-28 10:40 | 显示全部楼层 |阅读模式
整理的百度面经
4 A) ~8 H+ \7 K6 G4 E( U$ _, v  V8 @) G
zz2 G6 W( M9 Y2 R9 H

  \* u" Q! y  h! X8 S2 S% m7 y4 j; ^1 M( Q7 g( S) w
一面1. 网络编程经验:9 \% {$ p1 W  I9 H& S
   如何判断一个http请求,一个客户端请求已经结束;如何处理服务器多线程
4 `4 V. H/ u+ J0 t% ]   获得一个http请求后,是如何处理的?返回什么?有没有试过返回图片?
4 X; q. ^8 i% w9 _$ ^9 n1 b   服务器给客户端请求时,是用什么函数写?服务器如何获取客户端请求,用什么函数: g2 w9 z' b; c7 v
   (需要函数级别的连接有一个认识)
; q5 n$ M  K- o2 ^2 M: H: ^7 ]4 @" [9 Z: n6 i
2. cv操作是什么函数 cv_init, cv_wait, cv_signal
2 i" w- U8 C6 _4 j. L9 O$ ~3 N
: k. Z. O" b' V' X' e$ _( c6 Y4 m3. 有一些关键词点击次数的文件,如何输出最多点击的一百个(当时应该回答,组织一个100个元素的最大堆)
! ?  Y0 }5 Z7 x2 l8 y1 }. u5 _0 n8 z; @# a7 ~
4. 相交链表,如何找相交点(不能要标记)' c( M2 R  i) a) Z) l
   第一个头遍历到尾,知道他的长度;第二个头遍历到尾,知道他的长度。这样知道两截链表在交点前的长度,长的先走几步,然后一样长了,再轮流下走,就会相聚,相遇节点就是相交节点)
2 E2 g7 T6 x1 H& ~7 L% ~0 i8 r" m6 [; {2 Y  ^9 V; }% n  p
5. 有些文件,频繁访问在磁盘里头的,现在要放到内存中了。采用什么策略来决定哪些放到内存中?如果是一些url文件,放在内存后,如何快速的找到某个url的位置(采用字典序或者b树之类树状结构来组织) 如何快速找到哪些文件太久没人访问了,把他替换出去?(再那一棵树,记录树里每个位置url的访问时间;同时,那个url树的节点,也有这个时间树的对应的位置信息。时间树采用最大堆组织。要替换出去时,就从树顶取走节点,并且从中获得这个节点在url树对应位置,把他从url树中取走。当url被访问时,由于url树节点有时间树的位置信息,所以也很快找到对应节点在时间树的位置,然后把他的访问时间更新,然后做堆调整,每次堆调整为logN)
2 d3 S; H( s0 ^& l' {9 v$ C" i* r( f- a1 n; M
6. c语言相关:内联函数的好处?非内联函数被调用的过程是怎么样的?" I2 Z# T4 ]0 O1 n; m7 p9 q4 J
   int,short,char的struct,这几个数应该怎么放,内存小?怎么防止头文件被include多次?& e* D3 y/ F7 ~- U. Y# ?& ?6 I

1 Z) r+ j; R3 q- @+ Z7. 有没有什么问题想问的
* f* U" E9 |4 G8 linux 网络查看的命令
( H/ R, }, i! D8 O& R. C+ U, `5 _) K3 x# L$ |( q+ S
二面
6 X" ^1 _8 K7 {/ |6 s" i- D1. 介绍一个项目
& o9 z% y* W$ m) M+ |& c# d
) w# u; }1 I3 w; h# T- H2. 2.5亿个int数,可能有相同的。统计出这里头不同的数有多少个?只有2g内存。
7 ^" [7 e5 J/ X* ?(2.5*1000 000 000 * 4 =1G)
: d: ^, b3 W" Q2 |# l2 I9 h统计数-用hash,key是数,value是1或0,标记是否出现。
! C. l2 q% U0 ~: c- ]) D如果key就是那个数,那么找一个数的时候,要遍历hash才知道有没有,慢(就是如果hash紧凑,慢)。; _. C- I7 U2 h
解决方案:把key作为连续的(就是hash是稀疏的,有个key值没有存在这2.5亿个数中),像数组下标一样,那么要访问第n个数,直接到第n个去看,复杂度是O(1)
; I1 N& v" M+ e6 H1 [2 ^& ]$ B但是,如果连续,2.5亿个数,范围很广,而每个key用int存,会很大量,内存不一定够。) D1 p7 }7 ^# j8 [% g) p$ n
解决方案:每个key用一位bit来标志。即数字1放在第一个bit上,数字2放在第二个bit上。看第n位在不在,就找一下第n个bit是1,还是0
4 w' t7 j4 X1 F6 q% R  o3 ]* Q具体方法:char a[] 数组。假设找3,那么3在3/8--0...3,所以在a[0]中,找第3个bit,如果是0,就设置为1。最后看看a[]的二进制表示有多少个1就有多少个数7 R, e( B5 J, {% N: N3 i" z9 d" W; P

' @1 p  j+ F- z. k* r5 Z3. 海量数据,在mysql中,cpu占用率很高。如何解决?
# v+ j9 x& V8 u7 c% E8 }1.show processlist,看哪个sql查询的多,建索引(问:建立联合索引时,要考虑什么,怎么建(哪个在前,哪个列在后?)) v/ t0 W2 D. j; ^1 C
2.如果老是在拷贝到临时表,就改配置,把临时表内存改大些
+ {" ^" v; ?9 x  V( I3.还有什么方法:# R; \, x  O$ O; `3 q1 `  {* x8 }- m
1)分布式数据库 (问:如果你来设计分布式数据库,你会怎么设计?)
9 q& m3 T5 v# A8 O; d2)使用缓存   (问:如果缓存中的数据,被删除或跟新了,数据库怎么判断这个缓存的数据不能用了,是脏数据?)(不懂)5 s, s6 J9 H& }' I
问:什么情况下cpu会高?(内存不足)为什么内存不足cpu会高(频繁io读写)0 y$ v! {5 E- j( w& V5 x
5 J7 I1 N7 D& b; I5 J8 t
4. n个无序int,(有正有负),给一个数v,如何找出其中的a+b=v的两个数3 h4 _$ h, ?" g6 C. f; O; J
(我的答案是:排序 O(nlogn),记录序列中,0,大于v,小于v的3位。+ y$ B! P! \% d: Y
尝试最小的和最大的,最大不行,次大。。。,找到某个,加起来小于v了,停止5 q$ p& ~1 J) c: N
尝试次小的,从上次大头停止的位置开始尝试
6 h4 X5 V7 b1 X2 U3 U0 a---尝试范围两头不断缩小,复杂度为n)
' U+ v6 D: v7 l
" ]9 g$ K1 L% q/ n/ j2 k5. 网络相册,一个人可以有多个相册,一个相册有多个图片,如何快速实现增删查移动等操作。web页面上,图片是翻页显示。! [$ D. w0 R! S* i' J" Q9 x
(我回答:数据库记录:usr_id, book_id, item_id, position。相片放在磁盘上,目录为position/usr_id/book_id/item_id
. @, w. r3 w  C/ `$ ~$ W一次查两个操作:1)数据库查找2)根据位置取图片+ ?+ m9 k" ?+ h* V

) f9 W7 A) x/ y; w- |如果用户提取某个相册的所有图片,先给他第一个相片和所有item_id列表。然后用户翻页了,在客户端通过javascript能够知道翻的是哪个item,把item_id,book_id, usr_id发给服务器,服务器根据这个到目录下去找)$ x4 H, ?. G2 i' {9 N
(你这种设计会有什么问题?(答不上来。。。)(如果用户频繁翻页,那么服务器上会不断地在传输图片)(如何解决?)+ W7 e$ q( L$ o4 ^
3 w- c% Z+ [. y  j4 W
第五题我想不出好办法,我觉得一般他们都show thumbnail
; C3 e! V$ I) @- N2 ~就是预览小图片不把原始图片show在页面上,点击后才能看单个图片
3 w* F5 v$ A. Y2 w# @6 J. P+ T$ K  ?2 U8 n; ?4 a, |/ }: `

5 s% W& B! C4 @' O1 [7 A* V& ]' Y6. Unix系统里,一个简单的print hello world的c程序,从./a.out执行到屏幕打印出来这句话,是什么过程
* L0 E0 R  }4 A1 v# o(1.读elf,会从相对地址,计算出各个symbol的在进程中的绝对地址。然后找到入口main函数! p# f' i$ B* [: h0 e
  1.用到std的库,所有有run time load。7 C% F4 N( P8 Z  q$ N: X
  2.然后是print调用的进栈' f5 T% ?& H0 M
  3.然后是系统调用,当前进程被挂起。系统调用会调用驱动。。。(内核切换,用户态到内核态)
5 p% S8 J* E% a6 s9 z- t0 E  4.内核处理完再唤醒当前进程。(切换)+ ]8 J' H. e' g4 j: b* D
  5.print调用完毕,退栈
7 q# K0 H, G# ~; p  6.main函数退栈( t$ h& d7 K. z# Z9 A, M
% k7 l' R  L6 S! x3 T4 ?* n
问:哪个进程来调用的main?(不知道)
3 c. `4 Q! P7 r1 H: e/ o应该是当前运行a.out的这个和用户交互的shell作为父进程,然后父进程fork子进程,子进程和父进程一样,然后调用execv会load执行文件,和把参数传到main的堆栈中+ |- F( I6 R" n3 I$ O

/ o: q% W" f, i3 p7.socket编程,要注意什么问题
3 |3 O2 n/ b, A1 h(服务器的serversocket的基本模型。' a- N3 U  {4 B( y
但是大量请求,会不能及时响应。所以要多线程。, A+ N. \2 d$ e3 @- P2 J# i
一个监听线程,多个服务线程。服务线程一开始起来都阻塞在存放请求socket的tasklist上。wait
. p* Y2 F; Y! q4 u) O" |: l* v, }监听线程接受到client的socket,放入tasklist中,signal唤醒一个服务线程。服务线程处理它,并把它从list中移走
7 r8 U2 z" G& ~% d. H; r3 C注意问题:tasklist的存放的请求socket是会被放和移走的,消费者生产者问题。所以要synchronized来互斥?)
; {: b5 D/ E% C! V. T3 N; I  t/ g  a3 ]$ b
三面
) r' o  a7 }* I0 |8 Y3 P! j3 F. K4 X
+ X7 S. b  `: O& Y- p
  K5 y" b( @0 h9 n0 G3 @; [2. fread的过程(文件系统-内核。。。)) r* w, g/ {7 N6 r- m* z! P
3. 主DB在接到数据更新后同步到后台DB,如何避免网络丢失之类的问题* K7 H5 u4 Q9 ]' V6 ~
(参考答案1:传的是sql语句,接到后回ack,如果主DB发现一段时间没有回,重发;其实TCP传输,就保证了不会漏数据,所以不会考虑这个问题的)
2 v2 z. z# ~$ I: c* w(参考答案2:每次传sql语句和当前版本号,然后后台DB会对比版本号是不是正确,发现落后就发数据请求。主DB保留每次版本号更新关联的sql语句)
6 v- N6 [, L8 ~! L$ {+ Z6 y/ i8 l4. N个bit,如和判断其中有多少个1.(时间复杂度小于N)' x( N1 i" R0 l, R9 G0 `. a7 |
预存一个2的8次方大小的数组,每个数组值是,这个下标的数的二进制的1的个数,例如:' V7 d: D) }  L, i+ n
a[0]=0, a[1]=1, a[2]=1,a[3]=2....a[2^8-1]=7 (以空间换时间)7 r. [, g" C$ a+ v" y: f

* h: A- u) l. {. v然后一个byte一个byte的读,看看他的值,直接以这个值为下标去数组看他的1的个数
: s- w8 P" R6 B$ c) g( m! V+ r# K% s7 _* g; d  L
' p: e; c" C: A
另一个方法:# Y5 G: y7 y4 Z/ ^9 e7 Q6 U0 L5 f$ P
2 U7 [% ]/ M# s0 z( |: z
while(v){& Z1 J3 H7 v$ }: N- x+ ]7 x8 Q
v &= (v-1);
9 a! H+ b2 ^2 J: i2 q8 i! Qnum++;
8 Z! l8 N! J' g# A}
8 U% R) r+ H- G1000 & 0111 = 0, 所以每&一次,不为0,说明有1个1,&到为0为止,num就是1的个数。复杂度为1的个数。
4 L  r) J/ P0 C5 T
8 Y+ G/ R7 v1 Y1 Z, Y4 @/ GZz4 M6 N; R$ J% E5 j, l+ K
该内容转载自网络,版权归原作者所有。
8 [! A. y) W" H  x- b% u$ d9 [4 j9 h: ]2 p, w) @
……' L& Z  p0 F8 G6 n; M$ z1 t. E
http://bbs.aftjob.com/thread-164201-1-1.html
+ {! R$ u& ]- Q" g% l# R7 g7 i8 n3 n4 h6 P

; \3 t0 J4 E( _$ X* u& K百度(Baidu)求职俱乐部
5 o$ [- V# N; x& h  ~http://bbs.aftjob.com/group-4-1.html/ `/ p4 m/ Q* H' V4 @

1 k; R0 k4 k0 Q' V
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2026-6-11 09:50

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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