看到July大神收集的面试题目,看了几道做出解答。
腾讯七道面试题
27、请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
下面是网络上某博客给出的答案,他的宏定义没有加括号,我给加上了:
上面的宏定义很巧妙,但是没有考虑到溢出的情况,当A为很大的负值,B为正值的时候,两者的差由于溢出变成正数,导致得到的较大值为A。
比如:当A = -2147483648,B = 1时,A-B 溢出,截断后得到的结果是2147483647,本应该是负值,变成了正值,结果错误。
下面是一种改进:
我自己的定义是这样的:
宏_SIGN用来与值做与操作,可取得符号位,((A)&_SIGN)^((B)&_SIGN)表示 A的符号位和B的符号位做异或,也就是对A、B同号异号的情况做处理。异号,正者大;同号,判断差的符号。
28、两个数相乘,小数点后位数没有限制,请写一个高精度算法
29、有A、B、C、D四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时1、2、5、10分钟,只有一支手电,并且同时最多只能两个人一起过桥。请问,如何安排,能够在17分钟内这四个人都过桥?
老题目了,17分钟,很明显10分钟的和5分钟的要一起过去,而且只能走一遍,手电筒只能由1分钟的或者2分钟的带回来,方案如下:
- 1分钟和2分钟的过桥, 1分钟的回来 耗时:3分钟
- 5分钟和10分钟的过桥,2分钟的回来 耗时:12分钟
- 1分钟和2分钟的过桥 耗时:2分钟
30、有12个小球,外形相同,其中一个小球的质量与其他11个不同,给一个天平,问如何用3次把这个小球找出来,并且求出这个小球是比其他的轻还是重
31、在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可。
刚开始想用位图就行,后来发现中位数得考虑同一个数出现的次数。如果用归并排序的话会做大量无用功。只能用整型值来计数了,统计前5G+1个数,取第5G个和第5G+1个。
http://blog.youkuaiyun.com/lyso1/archive/2010/05/10/5573714.aspx写得很详细,只不过有64位能表示的远大于8G的数。
32、一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数
跟《编程珠玑》的题有点类似,如果是有序的话,可以采用二分法,读取值的中点,看之前的值的个数是否小于自身,如此递归。
这道题没有提及有序,用位图,40亿个刚好差不多需要4G/8 = 512M。
33、腾讯服务器每秒有2w个QQ号同时上线,找出5min内重新登入的qq号并打印出来。
5分钟内登陆的QQ数为5*60*2W = 6M。也是用位图,只不过是用两个位表示一个数,
0表示未登录,1表示登陆一次,2表示登陆多次。不过QQ号好像12位啦,超过int了。