找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1311|回复: 0

[兼职经验] 腾讯实习招聘面试题-软件开发

[复制链接]
发表于 2011-5-9 11:56 | 显示全部楼层 |阅读模式
腾讯实习招聘面试题-软件开发
& ^" t5 U# J1 ~, G+ d
9 z. q4 `; S) G% y* C) o' [- @- E6 f" y
腾讯实习招聘面试题-软件开发 . `2 m6 m8 n: N0 Z. J" v
& G" _, F7 ^0 q. @, L9 _: W& \7 h  a
9 X: |, q) Z& O) O+ Z* Z
zz
2 a# J0 d6 @+ T. v. J' t! t5 j; K+ t2 F, m3 Q* _
; J+ m+ H+ t, Z$ W
大部分是说说你自己的思想:$ D# ^5 C& ^# ?* ]. Q% g& L4 ?
1,一亿个数中取中位数. y, ~- t8 H) u# F* I' k5 M
2,一万个手机号有两个重复的,让你找出来3 N8 O* V+ k+ E# @" u: y
3,求二叉树中两节点的最长路径
3 N' l+ }, x/ ]8 z! ]$ [6 h
, W( r' t& m" h/ M6 u' h( a1.有一亿个随机数,不排序如何找出其中位数
+ u' H) ?2 t6 s. a% O题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。
, C7 Q" I( ?2 D# }" X% i
8 p7 F% ^% T- F) @' k3 I; O7 @! u  B关于中位数:数据排序后,位置在最中间的数值。即将数据分成两部分,一部分大于该数值,一部分小于该数值。中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了)。
) ^! q! D( w2 N# Z, t: {4 r3 A
. J+ L% c3 H/ J分析:明显是一道工程性很强的题目,和一般的查找中位数的题目有几点不同。
! n% p+ k; b- G# S: r1. 原数据不能读进内存,不然可以用快速选择,如果数的范围合适的话还可以考虑桶排序或者计数排序,但这里假设是32位整数,仍有4G种取值,需要一个16G大小的数组来计数。& H0 ^0 \$ B9 \
0 {  g" Y% K7 v( [9 f$ B
2. 若看成从N个数中找出第K大的数,如果K个数可以读进内存,可以利用最小或最大堆,但这里K=N/2,有5G个数,仍然不能读进内存。7 ?5 g2 C0 K- ^/ l5 [1 q" v0 \

2 P* a  i% {: c; z3. 接上,对于N个数和K个数都不能一次读进内存的情况,《编程之美》里给出一个方案:设k<K,且k个数可以完全读进内存,那么先构建k个数的堆,先找出第0到k大的数,再扫描一遍数组找出第k+1到2k的数,再扫描直到找出第K个数。虽然每次时间大约是nlog(k),但需要扫描ceil(K/k) 次,这里要扫描5次。
/ a: ^( k* B& p; F5 s& X( H9 K$ e! Z3 M9 V( Z/ [7 Y3 s
解法:首先假设是32位无符号整数。
  t. ~- S7 i! N8 h* ~; F1. 读一遍10G个整数,把整数映射到256M个区段中,用一个64位无符号整数给每个相应区段记数。9 [4 x" Y  h( L7 A5 i+ t5 _
说明:整数范围是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。
* {! q, F1 Y+ m( y- m6 u0 K# z6 z2 i1 s. w) \' g5 N' d9 J
2. 从前到后对每一段的计数累加,当累加的和超过5G时停止,找出这个区段(即累加停止时达到的区段,也是中位数所在的区段)的数值范围,设为[a,a+15],同时记录累加到前一个区段的总数,设为m。然后,释放除这个区段占用的内存。
0 p0 L" n. E/ C9 T4 _5 ?
$ l$ V9 W( l' q; ]6 B) Z3. 再读一遍10G个整数,把在[a,a+15]内的每个值计数,即有16个计数。6 a+ w! Y8 h6 \

% Z1 V  k& L* V* ^4. 对新的计数依次累加,每次的和设为n,当m+n的值超过5G时停止,此时的这个计数所对应的数就是中位数。/ @  ~% E% b: e- y9 `
; t1 G* H* |  W6 }8 j  P: ~
总结:/ j! d( S1 p& {7 b) |5 k% L6 `
1.以上方法只要读两遍整数,对每个整数也只是常数时间的操作,总体来说是线性时间。
1 h0 t2 E9 x% J+ I  j! v7 b$ |6 R
2. 考虑其他情况。+ o5 J7 i- x. w4 v$ T+ q9 M
若是有符号的整数,只需改变映射即可。若是64为整数,则增加每个区段的范围,那么在第二次读数时,要考虑更多的计数。若过某个计数溢出,那么可认定所在的区段或代表整数为所求,这里只需做好相应的处理。噢,忘了还要找第5G+1大的数了,相信有了以上的成果,找到这个数也不难了吧。$ n& o! G5 J' I1 y
: Q7 b& D" S5 U3 D
3. 时空权衡。
& b% B: Z, H" ^6 x2 l花费256个区段也许只是恰好配合2GB的内存(其实也不是,呵呵)。可以增大区段范围,减少区段数目,节省一些内存,虽然增加第二部分的对单个数值的计数,但第一部分对每个区段的计数加快了(总体改变??待测)。
! H2 z1 L8 Q, x- i. M& Y4 ?: m
0 D9 P0 ?! R! R2 X) u4. 映射时尽量用位操作,由于每个区段的起点都是2的整数幂,映射起来也很方便。
# \" P1 O& z  M3 N& V5 w
' t; a3 y+ P; s2.假设有一个应用程序A,现要设计一个应用程序B来动态 测试A,问如何设计这个软件?
! v- i( m8 B% J2 z4 b% v# w" ?: ]- ~( `  J% n8 C, l4 L
http://bbs.aftjob.com/thread-606762-1-1.html; a5 p! y' J3 F. V- }

, {& Z: e7 i) ?( p——% A+ P* ^, _6 i* o8 J  u9 b
腾讯(QQ)求职俱乐部
. s. n3 _" V( Z, ~, Whttp://bbs.aftjob.com/thread-37083-1-1.html
$ a: ^7 e, |/ u  t7 _——- S5 F' _0 |: U3 i8 S0 B  k8 f
4 F' X! g2 Y! ~: ]$ ~$ T, C, T# d! [5 l) J

, y: ~% K# v) x+ Y
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2026-1-23 07:53

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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