Mengdong的技术博客

学习,记录,分享

导航

腾讯实习面试(一)

第一次面对面的技术面试,总体来说还是有一些收获。

0. 腾讯QQ每天登录量达到10亿人次,现有一个文件记录了登录历史(10亿个QQ号,注意会有重复),请根据这个文件输出今天哪些用户登录了QQ?

等同于去重输出的问题。最直观的办法是暴力统计:例如 1) 利用DB主键自动去重 2) 分治,例如每1000万条记录作为一个单位去重,然后合并去重 3) MapReduce分布式处理

改进一下,单机就可处理的方案:

开辟一个bit数组(bool数组),QQ号的范围大概0-5,000,000,000,大约占5,000,000,000b/8≈5000Mb/8=625MB内存。

遍历记录文件,将每次读到的QQ号作为下标,数组对应位置的值置为true.

遍历完毕文件后遍历数组,将值为true的下标输出即可。

下面都是一些水题。

1. 用过关系数据库(用过)?用过什么关系数据库(MySQL),一个MySQL查询很慢,如何进行分析/调优?

explain查询,分析查询方案各部分代价,对代价较大的部分对应处理,例如加索引。

2. TCP协议中sequence号的作用?

标识包顺序,组装报文,重传回退机制的一些依据(详见网络教材)。

3. socket的通讯过程是怎样进行的。举例(我个人选择Java)说明socket通讯建立的过程。

首先,服务器端建立ServerSocket对象,开始监听。循环serverSock.accept(). ServerSocket的accept()方法是阻塞的。

然后客户端向服务器请求Socket连接,每请求一次,服务器端serverSock.accept()返回一次,返回的是和当前客户端的通讯Socket对象。

返回的这个服务器端Socket对象扔给一个线程进行后续通讯处理。这就是一个基本的Java Socket通讯代码。

4. 32位Linux下一个进程拥有多大虚拟地址空间?

3G. Windows是2G.

5. Cache问题

总体来说有如下几个要点:

1) Cache查找,命中怎么办?(直接返回结果)不命中怎么办?(查找后台数据,返回结果并更新Cache. 若Cache满则还需淘汰)
2) Cache更新,先更新Cache/后方数据?写回策略等。

6. 你平时如何调试?现在有个常驻内存的程序,运行若干时间后崩掉了,如何解决?

前一个问题:简单问题cout, 复杂逻辑和问题设置断点跟踪变量。

后一个问题:查看崩掉前的运行状况,尤其是CPU/内存,分析问题。

(接下来从一点展开思路)比如说是内存泄露问题。既然是常驻内存的程序,就一定有主循环反复执行某些事务。着重检查事务体的代码,尤其是涉及资源分配/释放的部分。

总之问了不少题,但是没有很难的。算是很顺利吧。

备注:成功进入二面

下面是各处收集的一些其他地区的腾讯面试题:

0. 我们知道每次登录QQ都会更新好友列表。请设计一个好友列表的更新方案,使得用户体验最好。

首先本地应该存储一份好友列表(这个简单)。问题的关键是怎么解决同步问题。即先在机器A登,然后在机器B登并修改好友列表(增删好友,改备注等),然后再在A登时的列表同步。

最简单的方法就是全更新(从服务器下载完整列表进行更新)。可能会因为好友列表太大而比较慢。

稍微改进一下,可采用版本号+服务器记录增量+本地增量更新的方式。

例如在机器A上登录QQ并且进行若干操作,登出时的状态:

A: 版本=1. 服务器: 版本=1.

登B,并且删除一个好友f,服务器记录修改,登出时更新版本号,此时状态:

A: 版本=1. 服务器: 版本=1, 删除f, 版本=2. B: 版本=2.

此时登录A,A将版本=1发送至服务器请求同步,服务器收到后将其后部分(红字)发送给A,A执行操作后同步完毕。

1. 现在有100亿条历史搜索关键词记录,如何找出前10条频度最高的搜索关键词?

待补

2. 一亿个数中取中位数

待补

3. 一万个手机号有两个重复的,找出来

待补

4. 求二叉树中两节点的最长路径

待补

posted on 2011-05-09 22:11  mdyang  阅读(1475)  评论(2编辑  收藏  举报