找回密码
 加入后院

QQ登录

只需一步,快速开始

搜索
查看: 1388|回复: 0

[面筋] 腾讯实习招聘面试题-软件开发

[复制链接]
发表于 2012-4-20 17:13 | 显示全部楼层 |阅读模式
腾讯实习招聘面试题-软件开发
/ i; R" u: l: G; w4 L
! H6 I0 f- R# O( m. H; K' v+ [9 t! F0 ~4 t) |
zz! `/ a6 R* L1 a

& I1 a2 e+ W6 e/ j* q' U6 |3 b
- L8 G% Z" G& h; s' h大部分是说说你自己的思想:
/ ]7 R' t$ J; l$ d1,一亿个数中取中位数2 ^# n$ r- H: a* Q7 D3 a
2,一万个手机号有两个重复的,让你找出来3 ^/ {1 g; u3 z+ D
3,求二叉树中两节点的最长路径/ h, Z+ @" K8 ]! y% r+ a% E
: M7 ^4 ~& i" J' u- `& `
1.有一亿个随机数,不排序如何找出其中位数$ [6 B) \2 m, S
题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。: X5 S& z0 P5 M# {
8 E0 @2 N- }) z3 k
关于中位数:数据排序后,位置在最中间的数值。即将数据分成两部分,一部分大于该数值,一部分小于该数值。中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了)。) H, l1 E5 ]9 U, x) ]

4 N% p0 K+ M7 R$ k5 [分析:明显是一道工程性很强的题目,和一般的查找中位数的题目有几点不同。
# ^- w+ _+ \: p* J9 {1. 原数据不能读进内存,不然可以用快速选择,如果数的范围合适的话还可以考虑桶排序或者计数排序,但这里假设是32位整数,仍有4G种取值,需要一个16G大小的数组来计数。+ D1 l6 R( `3 w: G
- Z0 c7 }8 S; t
2. 若看成从N个数中找出第K大的数,如果K个数可以读进内存,可以利用最小或最大堆,但这里K=N/2,有5G个数,仍然不能读进内存。( r  d; t: s" z! {0 L. ?9 V% C
" H# I2 t! R$ A  W- K2 Z
3. 接上,对于N个数和K个数都不能一次读进内存的情况,《编程之美》里给出一个方案:设k<K,且k个数可以完全读进内存,那么先构建k个数的堆,先找出第0到k大的数,再扫描一遍数组找出第k+1到2k的数,再扫描直到找出第K个数。虽然每次时间大约是nlog(k),但需要扫描ceil(K/k) 次,这里要扫描5次。
2 v; Y7 l# {% o0 L/ ?7 b2 @: j/ s' w6 @6 d
解法:首先假设是32位无符号整数。
% W3 w5 |* R2 R/ ?" t' w( Q1. 读一遍10G个整数,把整数映射到256M个区段中,用一个64位无符号整数给每个相应区段记数。
. E1 b- {7 O2 [0 I% F说明:整数范围是0 - 2^32 - 1,一共有4G种取值,映射到256M个区段,则每个区段有16(4G/256M = 16)种值,每16个值算一段, 0~15是第1段,16~31是第2段,……2^32-16 ~2^32-1是第256M段。一个64位无符号整数最大值是0~8G-1,这里先不考虑溢出的情况。总共占用内存256M×8B=2GB。
  f* }  d. U2 o( G. P; s! s3 H
9 K* w6 v1 h. @2. 从前到后对每一段的计数累加,当累加的和超过5G时停止,找出这个区段(即累加停止时达到的区段,也是中位数所在的区段)的数值范围,设为[a,a+15],同时记录累加到前一个区段的总数,设为m。然后,释放除这个区段占用的内存。' ?3 ]/ _, g& Q5 n

* O* Z4 I) s3 \; j3. 再读一遍10G个整数,把在[a,a+15]内的每个值计数,即有16个计数。# _5 Z* ?. x/ |  C6 y( b
. M" j5 X7 O% _; R+ m' X: q
4. 对新的计数依次累加,每次的和设为n,当m+n的值超过5G时停止,此时的这个计数所对应的数就是中位数。
5 ?9 Z7 a6 u$ V' |
+ H6 ~+ o3 x) _( c/ Q) S7 \总结:& H6 L( j! K1 B) \- b+ S- i& U# z
1.以上方法只要读两遍整数,对每个整数也只是常数时间的操作,总体来说是线性时间。
* G" Y' |4 Z/ _  t1 _' H+ o2 |( P2 j; T0 r/ b4 H% e7 X
2. 考虑其他情况。
9 d% F) d% i& h6 H! [若是有符号的整数,只需改变映射即可。若是64为整数,则增加每个区段的范围,那么在第二次读数时,要考虑更多的计数。若过某个计数溢出,那么可认定所在的区段或代表整数为所求,这里只需做好相应的处理。噢,忘了还要找第5G+1大的数了,相信有了以上的成果,找到这个数也不难了吧。
% A' U8 G# \/ I/ I+ }
6 f$ K3 {5 V: s0 i3 T3. 时空权衡。
  |: S' Y9 w! f& f8 G花费256个区段也许只是恰好配合2GB的内存(其实也不是,呵呵)。可以增大区段范围,减少区段数目,节省一些内存,虽然增加第二部分的对单个数值的计数,但第一部分对每个区段的计数加快了(总体改变??待测)。
5 Z. S4 h+ }( J8 O: {8 x/ ~* p+ f, G3 m# u$ y
4. 映射时尽量用位操作,由于每个区段的起点都是2的整数幂,映射起来也很方便。 4 T" i- I  ^* u$ {( }  X

- O* X( d1 R! z1 B' p+ p3 E: y2.假设有一个应用程序A,现要设计一个应用程序B来动态 测试A,问如何设计这个软件?" C) n: {2 m! i7 f
/ r, H! a. ^: v' C$ Q$ N! T
应聘腾讯面试问题靠记忆整理(四次面试):http://bbs.aftjob.com/thread-37097-1-1.html
9 p+ q- `$ T  x9 Q腾讯2010实习面试全纪录——终于结束了:http://bbs.aftjob.com/thread-612336-1-1.html
& B1 w. a4 i; g
+ s3 e9 T( v: F' Q" i" R/ L腾讯求职交流俱乐部:http://bbs.aftjob.com/group-47-1.html
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2026-9-18 13:07

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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