|
|
整理的百度面经% ^ e" r% p( |+ r/ ?7 j( f
6 M& ?. X3 c4 ^1 I" a. B! uzz
+ w0 H- ^+ I9 ` E. z% _; p
; k! _" e$ E6 n+ V
* _, ?6 j9 W# x/ Q% z5 P# _一面1. 网络编程经验:
; b8 X0 J+ r5 x* P 如何判断一个http请求,一个客户端请求已经结束;如何处理服务器多线程
! \4 i8 q/ \0 G8 p" @7 | 获得一个http请求后,是如何处理的?返回什么?有没有试过返回图片?
; F$ u. R' W& }4 h5 @ 服务器给客户端请求时,是用什么函数写?服务器如何获取客户端请求,用什么函数
' v9 X8 J1 @! X9 v1 j5 S$ A$ P (需要函数级别的连接有一个认识)
5 n& O$ [. b& w" C { H6 m
2 i2 b! n8 J: B: c2 W2. cv操作是什么函数 cv_init, cv_wait, cv_signal
9 N) C, u4 d) C1 F# i- y1 w3 D. K
, v( N' D4 L* z. q# w' p8 }. P3. 有一些关键词点击次数的文件,如何输出最多点击的一百个(当时应该回答,组织一个100个元素的最大堆)
! `* }2 g2 c; R* f% B2 @: L v
6 g8 ?4 j# Q; H4. 相交链表,如何找相交点(不能要标记)$ n8 c$ Y" P, B. I, O8 [* X) b J
第一个头遍历到尾,知道他的长度;第二个头遍历到尾,知道他的长度。这样知道两截链表在交点前的长度,长的先走几步,然后一样长了,再轮流下走,就会相聚,相遇节点就是相交节点) O: W; O. e* P; G" |
) I; _ `0 V) u/ u4 `2 ]/ e8 E5. 有些文件,频繁访问在磁盘里头的,现在要放到内存中了。采用什么策略来决定哪些放到内存中?如果是一些url文件,放在内存后,如何快速的找到某个url的位置(采用字典序或者b树之类树状结构来组织) 如何快速找到哪些文件太久没人访问了,把他替换出去?(再那一棵树,记录树里每个位置url的访问时间;同时,那个url树的节点,也有这个时间树的对应的位置信息。时间树采用最大堆组织。要替换出去时,就从树顶取走节点,并且从中获得这个节点在url树对应位置,把他从url树中取走。当url被访问时,由于url树节点有时间树的位置信息,所以也很快找到对应节点在时间树的位置,然后把他的访问时间更新,然后做堆调整,每次堆调整为logN)
* R$ ^( j& q6 z' L. D0 T( X. n' V+ c( g: E
6. c语言相关:内联函数的好处?非内联函数被调用的过程是怎么样的?+ d! [: {2 k- n0 r
int,short,char的struct,这几个数应该怎么放,内存小?怎么防止头文件被include多次?8 \" _ T3 i! N; g$ g4 a
: D$ \/ a$ {0 W2 L5 n" k- K7. 有没有什么问题想问的
/ a, P- C8 |. ~3 A8 linux 网络查看的命令4 f8 h5 @- ~: B( q* `/ P! K
# N, q4 U- F2 k; F+ E二面
% C4 O- Q* K/ T: p; X+ c1. 介绍一个项目
) m% }7 V7 L0 _) H# r$ M( y P
- X V$ ?& T" |* {1 s2. 2.5亿个int数,可能有相同的。统计出这里头不同的数有多少个?只有2g内存。
" D# s5 w- N# `(2.5*1000 000 000 * 4 =1G)6 _# ]$ }( m7 `3 p
统计数-用hash,key是数,value是1或0,标记是否出现。3 |" J* o. `9 ]0 h3 F
如果key就是那个数,那么找一个数的时候,要遍历hash才知道有没有,慢(就是如果hash紧凑,慢)。( z0 j: h6 Q G, ^3 Y6 c4 ?
解决方案:把key作为连续的(就是hash是稀疏的,有个key值没有存在这2.5亿个数中),像数组下标一样,那么要访问第n个数,直接到第n个去看,复杂度是O(1)
9 [' A* E+ I* L" j7 \但是,如果连续,2.5亿个数,范围很广,而每个key用int存,会很大量,内存不一定够。
0 m& I8 o. }& z9 M; x j, M" A# G解决方案:每个key用一位bit来标志。即数字1放在第一个bit上,数字2放在第二个bit上。看第n位在不在,就找一下第n个bit是1,还是0
9 N1 \9 I3 ^0 H具体方法:char a[] 数组。假设找3,那么3在3/8--0...3,所以在a[0]中,找第3个bit,如果是0,就设置为1。最后看看a[]的二进制表示有多少个1就有多少个数/ B4 t; I. Y- M+ V/ C7 B4 @; D9 ?
y6 \0 k1 R% l% H3. 海量数据,在mysql中,cpu占用率很高。如何解决?
3 X, N; K: S6 {7 F, y0 T1.show processlist,看哪个sql查询的多,建索引(问:建立联合索引时,要考虑什么,怎么建(哪个在前,哪个列在后?)
+ S2 T9 s3 n/ n; F/ \2.如果老是在拷贝到临时表,就改配置,把临时表内存改大些
, g% t. Z) q I+ I3.还有什么方法:
% F. k( \6 o! i3 d/ n1)分布式数据库 (问:如果你来设计分布式数据库,你会怎么设计?)- q2 L$ N0 z5 h
2)使用缓存 (问:如果缓存中的数据,被删除或跟新了,数据库怎么判断这个缓存的数据不能用了,是脏数据?)(不懂)
4 G# P2 h1 O& U问:什么情况下cpu会高?(内存不足)为什么内存不足cpu会高(频繁io读写)
5 P! a$ S9 G% b- }1 z+ S2 T" s
) {/ K8 f0 ]/ b7 g4. n个无序int,(有正有负),给一个数v,如何找出其中的a+b=v的两个数
: R3 L( y. b1 n) `4 C# v+ }(我的答案是:排序 O(nlogn),记录序列中,0,大于v,小于v的3位。
! \0 k5 b2 i# Q4 L# F: e尝试最小的和最大的,最大不行,次大。。。,找到某个,加起来小于v了,停止
3 F4 f& g( I1 p5 e: ^& W尝试次小的,从上次大头停止的位置开始尝试/ v/ |0 Z2 y$ Y6 T2 K
---尝试范围两头不断缩小,复杂度为n)) G& R! i, c9 o" u1 r
: R. T8 q$ w, p- u/ }6 m/ p5. 网络相册,一个人可以有多个相册,一个相册有多个图片,如何快速实现增删查移动等操作。web页面上,图片是翻页显示。
* f k! }1 p8 b(我回答:数据库记录:usr_id, book_id, item_id, position。相片放在磁盘上,目录为position/usr_id/book_id/item_id Y2 a1 y, ]5 O/ n: q* J
一次查两个操作:1)数据库查找2)根据位置取图片( l) s P2 r# d; [2 J, J& N6 Z
% Y: j; v1 ~) s$ V6 |$ ]' n
如果用户提取某个相册的所有图片,先给他第一个相片和所有item_id列表。然后用户翻页了,在客户端通过javascript能够知道翻的是哪个item,把item_id,book_id, usr_id发给服务器,服务器根据这个到目录下去找)9 L( V* ^: j7 k T6 W1 s
(你这种设计会有什么问题?(答不上来。。。)(如果用户频繁翻页,那么服务器上会不断地在传输图片)(如何解决?)" [5 u1 j. U* U* d$ l
( o/ o1 ~7 k7 M. U1 [第五题我想不出好办法,我觉得一般他们都show thumbnail
: R5 {7 X6 D& T1 }就是预览小图片不把原始图片show在页面上,点击后才能看单个图片
7 i* s6 u. D7 S& c# z
2 B/ G+ F! R9 X
9 Z9 a% {/ v6 }: Z/ I& v. [6. Unix系统里,一个简单的print hello world的c程序,从./a.out执行到屏幕打印出来这句话,是什么过程 E2 x5 O. ~) P
(1.读elf,会从相对地址,计算出各个symbol的在进程中的绝对地址。然后找到入口main函数
3 O t$ s8 ?0 Q0 L" T 1.用到std的库,所有有run time load。
" b# D. {7 e/ R3 C 2.然后是print调用的进栈
( U) k/ D* I/ a+ j 3.然后是系统调用,当前进程被挂起。系统调用会调用驱动。。。(内核切换,用户态到内核态)
$ }/ b+ a1 t5 R: ^ 4.内核处理完再唤醒当前进程。(切换)6 N% A. H+ E! W/ i: d( [3 g5 T1 ~
5.print调用完毕,退栈1 y$ v& s# j9 U. K1 f _
6.main函数退栈
. b- j) Y* j5 a0 x)( D# R8 T8 R" V0 q$ R9 ^
问:哪个进程来调用的main?(不知道)
2 C2 B- I! t) s( |8 T2 D0 f应该是当前运行a.out的这个和用户交互的shell作为父进程,然后父进程fork子进程,子进程和父进程一样,然后调用execv会load执行文件,和把参数传到main的堆栈中
. G5 N/ F. p$ T
4 S3 X; V: O! J2 C* C/ h B7.socket编程,要注意什么问题
2 z* m- V, T, x0 p(服务器的serversocket的基本模型。
1 O. d) _$ ?0 Q但是大量请求,会不能及时响应。所以要多线程。- o: K, E# v3 s, T% L
一个监听线程,多个服务线程。服务线程一开始起来都阻塞在存放请求socket的tasklist上。wait
" Z3 E( ~; k& w) R1 |7 ~) \监听线程接受到client的socket,放入tasklist中,signal唤醒一个服务线程。服务线程处理它,并把它从list中移走
+ l# n2 D; ]% V G% U9 t注意问题:tasklist的存放的请求socket是会被放和移走的,消费者生产者问题。所以要synchronized来互斥?). R! H" \4 N& ]: R! G& ?
) i4 G* u/ r; L( H8 K; l6 f三面" ^7 w. `+ W$ j; o( }3 ~+ @
# _' h- `: e8 J
; B* b7 l3 @* [. M1 h2 B2. fread的过程(文件系统-内核。。。)
4 h) j( e4 E4 D7 @0 ~4 O1 \3. 主DB在接到数据更新后同步到后台DB,如何避免网络丢失之类的问题
* w% Z/ c' P0 X2 \. d(参考答案1:传的是sql语句,接到后回ack,如果主DB发现一段时间没有回,重发;其实TCP传输,就保证了不会漏数据,所以不会考虑这个问题的)
6 E( g2 t) g P: t3 }9 A% n' X(参考答案2:每次传sql语句和当前版本号,然后后台DB会对比版本号是不是正确,发现落后就发数据请求。主DB保留每次版本号更新关联的sql语句)) g' C+ B! ?! x- X
4. N个bit,如和判断其中有多少个1.(时间复杂度小于N)
4 Y( H! H9 k" {# L4 Z* _* L预存一个2的8次方大小的数组,每个数组值是,这个下标的数的二进制的1的个数,例如:
+ Q0 ]1 ]3 f& oa[0]=0, a[1]=1, a[2]=1,a[3]=2....a[2^8-1]=7 (以空间换时间)
& k$ s8 t: Y X
9 d: \: e1 F7 J- A9 E5 v' {9 C( z9 g然后一个byte一个byte的读,看看他的值,直接以这个值为下标去数组看他的1的个数# X! f4 x; z2 t: k
/ {$ ]& X1 q' r- S s# ~1 I6 y
. g8 {* K9 E1 \7 l/ {
另一个方法:; c6 D/ s; U6 B; D
9 z7 i# z1 P8 u6 d. Z9 }4 U+ Z
while(v){
: j/ n2 Z9 _, y: _. Kv &= (v-1);
5 t3 q8 e; R _! x1 c1 l* Dnum++;, z/ F$ t7 f$ G$ @9 D! u
}- H6 T* E2 c% {, d- {
1000 & 0111 = 0, 所以每&一次,不为0,说明有1个1,&到为0为止,num就是1的个数。复杂度为1的个数。
5 u% V0 R$ l$ U
+ B3 k; u5 f& bZz
$ Z' v0 p5 K! V R1 @1 Y- `该内容转载自网络,版权归原作者所有。2 y9 j- B, s6 b8 v: B7 l/ N a
" |' i; V9 {: g$ e- x8 g……8 d% x) r: j, V; X3 Q. f
http://bbs.aftjob.com/thread-164201-1-1.html
! N% u' a" N3 Q4 d& e p, b( K q* K5 Q( D
@7 J* b7 K( V$ N4 ~
百度(Baidu)求职俱乐部
# Y; I( O4 Q0 z% J) J* N5 Khttp://bbs.aftjob.com/group-4-1.html
% G* \; T7 A. P5 c t: _5 j6 k, ^; ~0 F$ ]! K- |) G% i
|
|