转载:应聘新浪PHP开发笔试答题总结

下午去了新浪面试PHP应用开发工程师,一面是笔试,题目超多,而且有些很考验真实水平。前一段时间去用友,面的也是PHP开发,考题的广度和深度远不如新浪的这次,即使这样我也没有面试通过……可见我的水平了,还需努力啊!这里根据记忆记录几道题目:

第一题:遍历目录及子目录(要求给出同解的unix shell代码)

我是用递归解的题,比较简单,就不写了。

第二题:设计一个留言板,要求给出整个设计方案。要求画出用例,描述数据对象,阐述出发点和难点及要点。要求满足十万级访问量(读写比为10:1),要求数据持久保存并给出存储方案,要求兼顾不同地域和网络线路的访问者。

这个比较难耶……题目上直接就说:“本题目花费时间较长,可以先做后面的题目最后再做这道。”果然,等我最后答这道题的时候时间已经不多了,我就草草的写了几个开发要点(跟踪查询情况,对热点数据进行单独处理;优化表现层,降低刷新产生的查询量。还写了几条,但是后来忘记写的什么了),之后又画出了数据对象和简单的数据结构(我画了三个,一是用户,二是管理员,三是留言本身),还画了数据流(从用户注册开始,到用户发留言,然后管理员审核,然后用户查看留言),画完数据流就交卷了!没有列功能点,也没有画用例图……基本可以判定为0分……

第三题:有一个1G的文本文件,名字是maillog.txt,存储的格式如下:

heyahu@sina.com.cn
oeifj@yahoo.com
mhlgi@sina.com
qqdiwe@gmail.com
eriugh@qq.com

要求:内存占用不得大于512M,速度尽可能快,开销尽可能少(这两个是废话),最重要的是只输出邮箱为@sina.com的邮箱地址。(要求给出同解的unix shell代码)

我的解法是:

  1. 取第一行文本,即第一个邮箱地址;
  2. 从右取字符,到“@”为止;
  3. 判断字符数是否等于8(数数“sina.com”一共是8个字符),如果等于,则进入4),如果不等于返回1)读取下一行;
  4. 进一步判断该段字符是否等于“sina.com”,如果等于则输出该邮箱地址并进入下一步,如果不等于则返回1)读取下一行;
  5. 返回执行1)。

不知道这个方法好不好啊,我觉得是最普通的思路了。先判断字符个数是否等于8,是因为我觉得整数值的判断比字符的判断效率要高,开销也小一些。

第四题:给定一个路径$patht,要求设计一个函数,使得传递任意一个路径$path,返回path相对于patht的路径(即取相对路径)。比如对于下面这两个路径:“a\b\c\d\e.php”和“a\b\12\34\c.php”,后者相对于前者的相对路径就是“..\..\c\d”。要求用尽可能高效率的代码实现该功能(这种废话会给人很大压力的……)

我的解法是:

  1. 先将两个路径按照“\”分隔,分别存进arrpath[]和arrpatht[]这两个数组;
  2. 将数组放进一个while循环,循环条件是arrpath[$n]==arrpatht[$n],循环体是$res+=’..\’,其中$n为计数器(跳出循环后还要用到),$res是最终返回结果,即相对路径值;
  3. 跳出循环后,$n即代表两个数组第一个不相等元素的位置,然后$n2=count(arrpatht)-$n-1(这是计算还剩下多少个不一样的元素);
  4. 然后设置一个for循环,计数器$i,初始值$i=$n,结束条件为$i<=$n2,循环体是$res+=arrpatht[$i]."\",这个for的作用是将参照路径的剩余部分累加到相对路径值中;
  5. 最后返回$res即可

第五题:设一数据量为千万级的数据库库,通过监控发现,有90%的查询请求都是指向同一部分数据的,而这部分数据只占整个数据库容量的1%。问:如何设计数据库结构,以避免造成瓶颈。

这道题目也很有难度耶……我对DBA这个行当一点了解都木有,只能胡诌了……忘记写的是什么了……

第六题:给任意一段URL,取出该URL中包含的扩展名。如“http://www.sina.com/test.php?somevar”,返回.php或php。

我是这么解的:

  1. 从右端取字符,到第一个“.”为止,如果没有则返回空值,表示没有找到扩展名,取出的字符串放入$url;
  2. 将$url放入for循环,初始值$i=0,结束条件为$i<=strlen($url),然后判断substr($url,$i,1)是否是“\/:*?"<>|”中的任意一个,如果不是则$res+=substr($url,$i,1),如果是则退出for循环;
  3. 最户返回$res即可。

第七题:有两段代码:

  1. //代码1
  2. for ($i = 0; $i < 3; $i++){
  3.     if (ture){
  4.          dosth();
  5.      } else{
  6.          doothersth();
  7.      }
  8. }
  9. //代码2
  10. if (ture){
  11.     for ($i = 0; $i < 3; $i++){
  12.          dosth();
  13.      }
  14. else{
  15.     for ($i = 0; $i < 3; $i++){
  16.          dosth2();
  17.      }
  18. }

问:这两段代码有什么区别,以及各自的优缺点。

我是这么答的:两者的区别是,代码1即做for()运算,又做if运算;代码2只做一次if()运算。如果判断条件不变的话,代码2要比代码1更高效。

有印象的就这些了,剩下的都比较简单,都是入门级的题目。整整做了两个多小时……HR把笔试题拿过来的时候把我吓了一跳,那么厚的一叠……

最让我纳闷的是,我投递的明明是实习生的职位(我现在的年龄还能装一把应届毕业生,虽然我已经工作快两年了),结果面试的时候告诉我,给我的职位是PHP应用开发工程师,当时我就震惊了……然后看到一厚叠笔试卷子,我又震惊一回。

不过我估计没戏,一是水平不行(我也就实习生的水平),二是貌似HR对我的印象很差。面试结束后,我感觉有几道题我答的很不好,就很傻帽的给HR打电话问能不能给一份空白卷子(当时我心里想的是拿回去研究研究,后来我再想想这种举动实在是太傻缺了……),结果HR非常干脆的回答“不行”,然后就把电话挂了……

奉劝诸位,下次去新浪面试的时候先上厕所,而且千万不要管HR要笔试题(不过这种事情大概也就我办的出来吧)。

posted @ 2011-07-14 22:17  Charliee  阅读(1392)  评论(0编辑  收藏  举报