|
PHP腾讯面试题-设计任务-编程任务-it论坛-it社区-it星球论坛-php开发
设计任务:
1、最近总有人骚扰我们的投票模块,需要你来设计一个投票限制的东东
要求如下:
1)要求每个QQ号码(假设此QQ号码在UNIT32内可以表示)10分钟这内只能投5票。
2)我们的用户很踊跃,平均每天要有2000万人左右通过此程序投票。
说明:
1)无需写代码,只需要图跟文字即可。
2)对于关键逻辑,请用图加代码表示出来,这也是对你文字表达能力的一个考验。
3)对你能想到的所有的边界条件列出来,这是对你逻辑思维全面与敏捷性的考验。
4)存储部分,尽你所能吧。如果,你需要一个自己设计的存储层,那么把这个存储层的实现,用文字+图片方式描述清楚,要是设计合理,你会获得华丽的奖分。
核心问题:如何统计10分钟之内投了5票?
首先:以分钟为键切分数据集,
然后:每个数据集内,以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】
数据模型:
$data[ 201006072134时间分钟 ][ qq号码] = vote次数;
A.统计10分钟内投了多少票
$votes = 0;
for($i = 0; $i < 10; $i++ ){
$votes += $data[ $minute-$i ][ $qq ];
}
B.桶内投票数+1
$data[ $minute ][ $qq ]++;
C.过期统计数据,垃圾清理
unset($data[ $minute ]);
本答案转自http://www.hemono.com/?p=205
编程任务:
1、我们碰到了大麻烦,一个新来的传教士惹恼了上帝,上帝很愤怒,要求我们把圣经(bbe.txt)背熟,直至他说哪个单词,我们就要飞快的回答出这个单词在第几行第几个单词位置。听说你是个优秀的程序员,那么髟助我们完成这个不可能的任务吧。
要求如下:
1)/myworks/example/bbe.txt,98版本英文圣经一本
2)输入部分要求如下:php ./example.php [单词]
3)输出部分如下:[单词] 1,2 2,4 5,6 表示:此单词在1行2列(第二个单词),2行4列...
说明:
1)此文本4MB之巨...
2)单词的含义:由英文字母(大小写),数字(0-9)组成的串
3)提供给你的机器OS为ubuntu 9.10,内存只有1G,而且,很不幸的,其中700M用来做了别的
4)上机考试不允许上网,但我装了man文档以及读取CHM以及PDF的阅读器,在电脑的桌面的CHM文件夹中,有相应的PHP参考手册
5)算法复杂度要求不能大于O(N^2)(就是N的平方)
6)什么?PHP低效且用起来不顺手,好的,你可以用别的语言来实现。但注意:提供给你的机器上只有python 2.4/perl 5.8/gcc[g++] 4.1
<?php
function find($word)
{
$fp = fopen('bbe.txt','r');
$ln = $col = array();
$i = 1;
while(!feof($fp))
{
$data = fgets($fp);
if (preg_match_all('/(\s)*'.$word.'(\s)+/',$data,$match))
{
$num = count($match[0]);
if( $num == 1)
{
$ln[] = $i;
$col[] = stripos($data, $word);
} else {
$start = 0;
for ($j=0;$j<$num;$j++){
$ln[] =$i;
$start =$col[] = stripos($data,$word,$start);
$start++;
}
}
}
$i++;
}
fclose($fp);
$xy = array();
for($k=0;$k<count($ln);$k++){
$xy[] = $ln[$k].','.$col[$k];
}
print_r($xy);
}
find($argv[1]);
牛年求牛:有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛。
function MakeCow($n){
static $num = 1; for($j=1; $j<=$n; $j++){ if($j>=4 && $j<15) { $num++; MakeCow ($n-$j); } if($j==20){$num--;} }
|
|