IT技术博客大学习 共学习 共进步

腾讯php程序员面试题目答案

排头兵 @ Talk 2010-07-21 23:47:33 浏览 8,802 次

在我鸦片师兄的博客看到他对腾讯面试题的解答,我心血来潮,在他的基础上面提出了自己的解法,主要是受他的启发,利用令牌算法优化了一下.

设计任务:
1、最近总有人骚扰我们的投票模块,需要你来设计一个投票限制的东东
要求如下:
1)要求每个QQ号码(假设此QQ号码在UNIT32 内可以表示)10分钟这内只能投5票。
2)我们的用户很踊跃,平均每天要有2000万人左右通过此程序投票。
说明:
1)无需写代码,只需要图跟文字即可。
2)对于关键逻辑,请用图加代码表示出来,这也是对你文字表达能力的一个考验。
3)对你能想到的所有的边界条件列出来,这是对你逻辑思维全面与敏捷性的考验。
4)存储部分,尽你所能吧。如果,你需要一个自己设计的存储层,那么把这个存储层的实现,用文字+图片方式描述清楚,要是设计合理,你会获得华丽的奖分.

解答:
核心问题:如何统计10分钟之内投了5票?

首先:以秒为键切分数据集,10*60=600个时间戳桶,并添加一个Forbid令牌桶
然后:每个数据集内,以qq号码为键,vote次数为值
OK,已经成功转换为key-value方式存储,2000万的日投票,除以86400秒,并发231.48rps,使用memcache能够轻松胜任。

数据集ID:201006072134
【QQ号码:Vote次数】

201006072134 | 201006072135 | 201006072136
【12345:3】 | 【12345:3】 | 【12345:3】
【88888:2】 | 【88888:3】 | 【88888:3】

把下一秒钟不能投票的同学 生成一个令牌桶Forbid。
―――――-
Forbid令牌桶
【12345】
【55555】
【66666】
【77777】
【99999】
―――――-
if(in_array($uid,$not_vote))
{
$flag = ‘不能投票’;
}
else
{
$flag = ‘可以投票’;
//insert 新时间戳桶
}

定时任务
1、unset(10分钟前的时间戳桶)
2、重新生成令牌桶

建议继续学习

  1. Java开发岗位面试题归类汇总 (阅读 21,760)
  2. 面试题 – 为什么我的朋友圈不见了? (阅读 11,802)
  3. 加州求职记 (阅读 11,361)
  4. 整理了一份招PHP高级工程师的面试题 (阅读 11,300)
  5. 海量数据面试题举例 (阅读 10,824)
  6. 面试IT业界顶尖企业所应该知道的10道题(1) (阅读 8,341)
  7. 如何在面试中发现优秀程序员 (阅读 8,102)
  8. 聊聊ThoughtWorks面试 (阅读 7,422)
  9. IBM面试记 (阅读 7,220)
  10. 有道面试总结 (阅读 6,940)