找回密码
 加入后院

QQ登录

只需一步,快速开始

搜索
查看: 1459|回复: 0

[面筋] 整理的百度面经

[复制链接]
发表于 2011-6-28 10:40 | 显示全部楼层 |阅读模式
整理的百度面经
: S+ k5 e3 O. _( m2 T# g
1 F, u. f# N$ p: rzz7 ?$ p( ^: E( b) N  n
# ?1 B! l: c0 Y0 V! i1 ?+ ?( s& Y

# _& o/ @: |6 b0 U3 H一面1. 网络编程经验:
( Z" R" |0 O  W! Y" ~   如何判断一个http请求,一个客户端请求已经结束;如何处理服务器多线程
  }& R/ ]/ [" g% [% u4 x4 `   获得一个http请求后,是如何处理的?返回什么?有没有试过返回图片?8 P* S  V. f9 T
   服务器给客户端请求时,是用什么函数写?服务器如何获取客户端请求,用什么函数9 F" F; j/ _" f* v* g. R6 e
   (需要函数级别的连接有一个认识)6 Y6 a. Z4 p# }7 ?6 ]+ b+ x' @
$ i1 x8 F% i# ^. ?4 m! |
2. cv操作是什么函数 cv_init, cv_wait, cv_signal6 d. [4 D9 Z6 h( f6 C9 w: g

+ p% ]# C, ?8 R, o, d. T9 S' h3. 有一些关键词点击次数的文件,如何输出最多点击的一百个(当时应该回答,组织一个100个元素的最大堆)
) K2 f- h1 {9 ]9 ]1 {( ^8 z3 |2 s$ g. L
4. 相交链表,如何找相交点(不能要标记)
. z, W6 s: J6 g- g* m! q   第一个头遍历到尾,知道他的长度;第二个头遍历到尾,知道他的长度。这样知道两截链表在交点前的长度,长的先走几步,然后一样长了,再轮流下走,就会相聚,相遇节点就是相交节点)) D  w# S! \9 H' m# b' S
0 c- B0 s+ B1 o3 ]) @) j
5. 有些文件,频繁访问在磁盘里头的,现在要放到内存中了。采用什么策略来决定哪些放到内存中?如果是一些url文件,放在内存后,如何快速的找到某个url的位置(采用字典序或者b树之类树状结构来组织) 如何快速找到哪些文件太久没人访问了,把他替换出去?(再那一棵树,记录树里每个位置url的访问时间;同时,那个url树的节点,也有这个时间树的对应的位置信息。时间树采用最大堆组织。要替换出去时,就从树顶取走节点,并且从中获得这个节点在url树对应位置,把他从url树中取走。当url被访问时,由于url树节点有时间树的位置信息,所以也很快找到对应节点在时间树的位置,然后把他的访问时间更新,然后做堆调整,每次堆调整为logN)
. g5 ~) Q2 Z, b. H- P: u1 N+ E3 w2 c8 s$ q, c
6. c语言相关:内联函数的好处?非内联函数被调用的过程是怎么样的?; \8 S. |" X6 g- R3 h* T) a
   int,short,char的struct,这几个数应该怎么放,内存小?怎么防止头文件被include多次?. ]+ F( Y' N" ?; J  a8 w
( R1 N* q* V1 k7 o: ^' M
7. 有没有什么问题想问的" u' m" q2 S# @( [5 O4 I$ }
8 linux 网络查看的命令
5 F' j2 v1 n6 b# d6 K0 B) ?8 V& V  M* @$ q
二面
+ v6 ^! ?6 A" c1 @6 ]1. 介绍一个项目7 `$ X) m4 S) }  N- E2 w, a4 w2 a
8 d' |7 F' u4 c& y2 ?
2. 2.5亿个int数,可能有相同的。统计出这里头不同的数有多少个?只有2g内存。
8 e$ V! Q- y& q3 ?) }8 E  W(2.5*1000 000 000 * 4 =1G)1 f7 z1 J! s1 c( b( K
统计数-用hash,key是数,value是1或0,标记是否出现。7 [5 |5 S. X7 k% i2 @
如果key就是那个数,那么找一个数的时候,要遍历hash才知道有没有,慢(就是如果hash紧凑,慢)。$ s; {" @! [# T, B% I/ ~6 o
解决方案:把key作为连续的(就是hash是稀疏的,有个key值没有存在这2.5亿个数中),像数组下标一样,那么要访问第n个数,直接到第n个去看,复杂度是O(1)4 D9 g& A$ M  `4 D
但是,如果连续,2.5亿个数,范围很广,而每个key用int存,会很大量,内存不一定够。
  x! q" t: X* ]/ X: i解决方案:每个key用一位bit来标志。即数字1放在第一个bit上,数字2放在第二个bit上。看第n位在不在,就找一下第n个bit是1,还是0. G% w6 D% W! P) x+ n
具体方法:char a[] 数组。假设找3,那么3在3/8--0...3,所以在a[0]中,找第3个bit,如果是0,就设置为1。最后看看a[]的二进制表示有多少个1就有多少个数; ?* y8 T1 U$ K4 c, n
/ K0 C' B, q' U1 v
3. 海量数据,在mysql中,cpu占用率很高。如何解决?0 D! Y+ h% Z& y/ m
1.show processlist,看哪个sql查询的多,建索引(问:建立联合索引时,要考虑什么,怎么建(哪个在前,哪个列在后?)
) _/ @* T3 `( T2.如果老是在拷贝到临时表,就改配置,把临时表内存改大些
" }) U, \' V: f, {3.还有什么方法:% a9 Q, U, K/ E3 o4 N& F( ]. g
1)分布式数据库 (问:如果你来设计分布式数据库,你会怎么设计?)* f; F0 e; E6 Q: Q3 P9 \% W& Y
2)使用缓存   (问:如果缓存中的数据,被删除或跟新了,数据库怎么判断这个缓存的数据不能用了,是脏数据?)(不懂)
- C3 A# L: q/ `3 }- H3 N. _/ V问:什么情况下cpu会高?(内存不足)为什么内存不足cpu会高(频繁io读写)- s# w" H! K0 F; P8 U

4 F* `' C! |6 f4 ?6 s6 s/ k4. n个无序int,(有正有负),给一个数v,如何找出其中的a+b=v的两个数
& M& c" o" }) s( s(我的答案是:排序 O(nlogn),记录序列中,0,大于v,小于v的3位。
8 H# E% k9 H: a尝试最小的和最大的,最大不行,次大。。。,找到某个,加起来小于v了,停止! @# a$ @; j% a+ |9 r8 X0 \5 H
尝试次小的,从上次大头停止的位置开始尝试
  N6 J5 |2 }% T---尝试范围两头不断缩小,复杂度为n)
% K+ N, o( u5 R+ W4 L, g# C* Z( Y, O1 Z
  a6 n1 m5 I4 ]+ T( h# H9 ~5. 网络相册,一个人可以有多个相册,一个相册有多个图片,如何快速实现增删查移动等操作。web页面上,图片是翻页显示。( ~5 E4 o+ c' O- {
(我回答:数据库记录:usr_id, book_id, item_id, position。相片放在磁盘上,目录为position/usr_id/book_id/item_id
  q$ R+ @; Y; H% f! U7 h一次查两个操作:1)数据库查找2)根据位置取图片
9 @, y/ ?# m: P3 U; Z  C
0 K- r/ T9 S* r0 L. }如果用户提取某个相册的所有图片,先给他第一个相片和所有item_id列表。然后用户翻页了,在客户端通过javascript能够知道翻的是哪个item,把item_id,book_id, usr_id发给服务器,服务器根据这个到目录下去找)
) H4 v1 x. T% J" g6 }6 q9 B6 U(你这种设计会有什么问题?(答不上来。。。)(如果用户频繁翻页,那么服务器上会不断地在传输图片)(如何解决?)
* u8 ^$ r, V/ M6 C$ k
) G& _/ p( ?$ P第五题我想不出好办法,我觉得一般他们都show thumbnail
8 ]  E" W7 i% t: L就是预览小图片不把原始图片show在页面上,点击后才能看单个图片' u- y; x3 l# f% [; }/ |. s: y
& x4 r+ B* L" U* c7 ]

0 J6 \+ ~  V" m6 T" j  v6. Unix系统里,一个简单的print hello world的c程序,从./a.out执行到屏幕打印出来这句话,是什么过程
( e9 I0 h" g7 \1 @' y% s0 K(1.读elf,会从相对地址,计算出各个symbol的在进程中的绝对地址。然后找到入口main函数
7 j; T/ a/ o$ v* Y  c/ K  1.用到std的库,所有有run time load。
3 L- _% w, S- e' F' m6 x3 w  2.然后是print调用的进栈
  v4 b7 ]! i, I/ y' \6 v8 s3 k  3.然后是系统调用,当前进程被挂起。系统调用会调用驱动。。。(内核切换,用户态到内核态)# l# X6 V0 z& c, O" d
  4.内核处理完再唤醒当前进程。(切换)
. p4 ]  Y4 N$ u  5.print调用完毕,退栈
% e( x( a0 ^) F/ {  6.main函数退栈
# l* s, w: i# C8 C7 {- l7 M- M
, n% Z3 e) \5 l, L* D" v5 n问:哪个进程来调用的main?(不知道)
3 n/ x' m/ A0 N应该是当前运行a.out的这个和用户交互的shell作为父进程,然后父进程fork子进程,子进程和父进程一样,然后调用execv会load执行文件,和把参数传到main的堆栈中
- A" x& Y3 u& F, I
* s5 V5 T8 P. Q) r. z+ D7.socket编程,要注意什么问题
0 A- h6 n: ]) y5 r) u6 c7 J(服务器的serversocket的基本模型。
1 f/ r- r- {' C2 z# r) m6 {但是大量请求,会不能及时响应。所以要多线程。
) E. E4 }' D4 T+ h! C; L$ A一个监听线程,多个服务线程。服务线程一开始起来都阻塞在存放请求socket的tasklist上。wait. u& T; D: N: C* Q
监听线程接受到client的socket,放入tasklist中,signal唤醒一个服务线程。服务线程处理它,并把它从list中移走: E7 G" u- C9 n" f9 W& u6 s- ~
注意问题:tasklist的存放的请求socket是会被放和移走的,消费者生产者问题。所以要synchronized来互斥?)
) z! m4 U* f; B& [9 h' T+ ]  U* S5 x8 ^$ l! g! x
三面  C  ]1 U% a4 L
$ U; c3 |' E/ a: R9 v. `' s4 n
5 Z& u1 l- Q2 K
2. fread的过程(文件系统-内核。。。)
0 D" r8 D+ b' R3. 主DB在接到数据更新后同步到后台DB,如何避免网络丢失之类的问题, t. j9 {# D1 a( N8 N; j
(参考答案1:传的是sql语句,接到后回ack,如果主DB发现一段时间没有回,重发;其实TCP传输,就保证了不会漏数据,所以不会考虑这个问题的)
  i: j% t& `% l& S) w$ M(参考答案2:每次传sql语句和当前版本号,然后后台DB会对比版本号是不是正确,发现落后就发数据请求。主DB保留每次版本号更新关联的sql语句)
+ [' P7 W  W3 R' I4. N个bit,如和判断其中有多少个1.(时间复杂度小于N)
1 V! z/ A0 }% N- v7 A- H* C1 p" M预存一个2的8次方大小的数组,每个数组值是,这个下标的数的二进制的1的个数,例如:! I: G2 w  }# n& ^
a[0]=0, a[1]=1, a[2]=1,a[3]=2....a[2^8-1]=7 (以空间换时间)- f: N/ V9 W7 C  r; K5 W
  A6 X* p% t$ }1 ~3 h2 A8 n
然后一个byte一个byte的读,看看他的值,直接以这个值为下标去数组看他的1的个数
% Y; P" t! O/ m( b! c  C
: U, i" a# o% r/ p1 V, n: i
3 P. a1 }# l6 s& \另一个方法:; w! B- t3 B4 M- I9 I2 y/ \. ~

, Y, O" H. b; u0 C7 qwhile(v){8 Y+ \# L5 u  Q7 m& y  @* Y( w
v &= (v-1);
% G; M: [6 B1 b% G" z( e6 N# }num++;* s  E- u! y6 M
}
# J5 }& Y( q6 Y. ?$ q( o1000 & 0111 = 0, 所以每&一次,不为0,说明有1个1,&到为0为止,num就是1的个数。复杂度为1的个数。
! j! S  e! a: z" g' M7 K7 f, K: E) s" M9 C% s4 b7 b) _
Zz+ C- H% c6 k; k8 x% g
该内容转载自网络,版权归原作者所有。- O+ A5 }' q- h# w
0 U# q8 p1 m; W* D
……- I2 c2 |0 P) G' _# t
http://bbs.aftjob.com/thread-164201-1-1.html. j& q- @( x! r
4 t6 w9 `( K) c' f; Z& h7 `
! v0 F2 R# h9 c/ Z
百度(Baidu)求职俱乐部 ) v; j2 ^' u' d# [8 q
http://bbs.aftjob.com/group-4-1.html
6 K  u, [, w; C0 X
+ Q9 p2 B( A2 o# M6 x( `% B) ~+ V
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2026-6-11 08:08

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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