传说中的腾讯面试题

说在前面:
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); 

你可能感兴趣的:(编程,PHP,qq,面试,腾讯)