传说中的腾讯面试题
说在前面:
1、以下题目,除了编程任务外其他都需要写在给你提供的草纸上。纸张是珍贵的地球资源,请节约使用。编程任务在有相应的环境时,会要求上机书写,实在没有条件,就只能写在草纸上了。
2、时间:
基础任务+进阶任务+设计任务 = 90分钟
编程任务 = 60分钟
基础任务:
1、请列举你能想到的UNIX信号,并说明信号用途。
Unix信号量在我们的使用中也经常用到,今天,我们就来学习下Unix信号量的知识。信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。
UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。
Unix信号量也可以在文件/usr/include/sys/signal.h中查看
#define SIGHUP 进程由於控制终端死去或者控制终端发出起命令
#define SIGINT 键盘中断所产生的信号
#define SIGQUIT 键盘终止
#define SIGILL 非法的指令
#define SIGTRAP 进程遇到一个追踪(trace)或者是一个中断嵌套
#define SIGABRT 由abort系统调用所产生的中断信号
#define SIGIOT 类似於SIGABRT
#define SIGBUS 进程试图使用不合理的记忆体
#define SIGFPE 浮点异常
#define SIGKILL KILL
#define SIGUSR1 用户自定义
#define SIGSEGV 段错误
#define SIGUSR2 用户自定义
#define SIGPIPE 管道操作时没有读只写
#define SIGALRM 由alarm系统调用产生的timer时钟信号
#define SIGTERM 收到终端信号的进程
#define SIGSTKFLT 堆叠错误
#define SIGCHLD 子进程向父进程发出的子进程已经stop或者终止的信号
#define SIGCONT 继续运行的信号
#define SIGSTOP stop
#define SIGTSTP 键盘所产生的stop信号
#define SIGTTIN 当运行在後状态时却需要读取stdin的资料
#define SIGTTOU 当运行在後状态时却需要写向stdout
#define SIGURG socket的紧急情况
#define SIGXCPU 进程超额使用CPU分配的时间
#define SIGXFSZ 进程使用了超出系统规定文件长度的文件
#define SIGVTALRM 内部的alarm时钟过期
#define SIGPROF 在一个程式段中描绘时钟集过期
#define SIGWINCH 终端视窗的改变
#define SIGIO 非同步IO
#define SIGPOLL SIGIO pollable事件发生
通过结合trap命令使用:trap <command-list> <signal-list>
以上这些Unix信号量的知识,希望大家能够记住,方便以后我们的使用。
2、请列举、你能想到的所有的字符串查找算法,并加注释简单说明。
3、有一个IP地址(192.168.0.1),请写出其32位无符号整数形式。
0001 0010 0001 1000 0000 0000 0000 0001
4、写出、你能想到的所有HTTP返回状态值,并说明用途(比如:返回404表示找不到页面)
"100" : Continue
"101" : witching Protocols
"200" : OK
"201" : Created
"202" : Accepted
"203" : Non-Authoritative Information
"204" : No Content
"205" : Reset Content
"206" : Partial Content
"300" : Multiple Choices
"301" : Moved Permanently
"302" : Found
"303" : See Other
"304" : Not Modified
"305" : Use Proxy
"307" : Temporary Redirect
HTTP 400 - 请求无效
HTTP 401.1 - 未授权:登录失败
HTTP 401.2 - 未授权:服务器配置问题导致登录失败
HTTP 401.3 - ACL 禁止访问资源
HTTP 401.4 - 未授权:授权被筛选器拒绝
HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败
HTTP 403 - 禁止访问
HTTP 403 - 对 Internet 服务管理器 (HTML) 的访问仅限于 Localhost
HTTP 403.1 禁止访问:禁止可执行访问
HTTP 403.2 - 禁止访问:禁止读访问
HTTP 403.3 - 禁止访问:禁止写访问
HTTP 403.4 - 禁止访问:要求 SSL
HTTP 403.5 - 禁止访问:要求 SSL 128
HTTP 403.6 - 禁止访问:IP 地址被拒绝
HTTP 403.7 - 禁止访问:要求客户证书
HTTP 403.8 - 禁止访问:禁止站点访问
HTTP 403.9 - 禁止访问:连接的用户过多
HTTP 403.10 - 禁止访问:配置无效
HTTP 403.11 - 禁止访问:密码更改
HTTP 403.12 - 禁止访问:映射器拒绝访问
HTTP 403.13 - 禁止访问:客户证书已被吊销
HTTP 403.15 - 禁止访问:客户访问许可过多
HTTP 403.16 - 禁止访问:客户证书不可信或者无效
HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效
HTTP 404.1 - 无法找到 Web 站点
HTTP 404 - 无法找到文件
HTTP 405 - 资源被禁止
HTTP 406 - 无法接受
HTTP 407 - 要求代理身份验证
HTTP 410 - 永远不可用
HTTP 412 - 先决条件失败
HTTP 414 - 请求 - URI 太长
HTTP 500 - 内部服务器错误
HTTP 500.100 - 内部服务器错误 - ASP 错误
HTTP 500-11 服务器关闭
HTTP 500-12 应用程序重新启动
HTTP 500-13 - 服务器太忙
HTTP 500-14 - 应用程序无效
HTTP 500-15 - 不允许请求 global.asa
Error 501 - 未实现
HTTP 502 - 网关错误
基础任务-选作(会得到额外分数):
1、画几个你最熟悉的SERVER端模型出来(格式不重要,尽量将图画清楚,说明思路即可)
进阶任务:
1、PHP的垃圾收集机制是怎样的?
说明:
1)如果,你熟悉PHP源码,那么请从源码入手,回答些问题,会获得额外加分
2)如果,你不熟悉PHP源码,那么尽你所能,多写点东西,包括利用自己的编程直觉得到的信息,都可以。
3)对,则有分,错误不扣,不写无分。
2、请写出HTTP头,并符合以下要求:
1)这是一个post请求
2)目标:http://www.example.com:8080/test
3)POST变量:
username: test
pwd: test2
intro: Hello world!
4)包含以下COOKIE信息:
cur_query: you&me
说明:
1)如果,你记不得某个HTTP协议中的指令字了,那么,无奈这举是用“汉字”代替。
2)如果,你能记住更多的HTTP协议指令字,那么多写几句,总是没坏处,对吧?
3)最关键的,只需要画出正确的“轮廓”(还记得httpwatch等工具打印出来的头部吗?那就是“轮廓”的含义),也会有分数,但如果,连“轮廓”都写错了,那么就很遗憾了。
设计任务:
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
Java代码
#!/usr/bin/php
<?php
$handle = fopen('bbe.txt','r');
$word = $argv[1];
$x = array();
$y = array();
$i = 1;
while(!feof($handle)){
$data = fgets($handle);
if(preg_match_all('/(?<![a-z])'.$word.'(?![a-z])/i',$data,$matches)){
if(count($matches[0])==1){
$x[] = $i;
$y[] = stripos($data,$word);
}else{
$countInLine = count($matches[0]);
$start = 0;
for($j=0;$j<$countInLine;$j++){
$x[] = $i;
$start = $y[] = stripos($data,$word,$start);
$start++;
}
}
}
$i++;
}
fclose($handle);
$xy = array();
for($k = 0;$k < count($x);$k++){
$xy[] = $x[$k].','.$y[$k];
}
echo '<pre>';
print_r($xy);