发布于 2014-10-17 09:16:00 | 593 次阅读 | 评论: 0 | 来源: 网友投递
去哪儿网
去哪儿网(Qunar.com)总部位于北京,于2005年5月,由庄辰超与戴福瑞(Fritz Demopoulos)、道格拉斯(Douglas Khoo)共同创立。作为中国第一个旅游搜索引擎,使中国旅行者首次能够在线比较国内航班和酒店的价格及服务。
首先介绍一下自己的情况:本人通信硕士,编程能力较差(惭愧,本科期间都在玩了),所有的编程都是在研究生第一年自学的。不过大多学的都是单片机之类的编程,主要用到C语言和一点点汇编,C++什么的都是最近找工作才现看的。
本人二面的时候被刷,讲一下面试经历,希望大家能吸取一些教训。
去哪网的开发笔试题网上应该都有,这里指简略的说一说:第一题就是让写折半查找;第二题是从字符串找出第一个出现2次的字符;第三题好像是数组排序,具体忘了。
去哪网其实大家应该都知道,做的都是服务器搜索和java方面的,所以用C/C++答的笔试题的同学大多没进面试,而用java写的同学几乎100%能进面试。所以大家如果java和C/C++都会的话,那就首选java吧,这样容易进面试。
中午接到面试通知大概下午5:20让我去面试, 我5点多点到了面试地点后直到6点左右才轮到我。一面的面试官很nice,和颜悦色让人感觉不那么紧张(这是本人是第一次找工作面试),他那我的简历看了 一下,也没让我自我介绍,直接就和我说“看你主要做的单片机相关的东西,那你给我说一下你所接触过的处理器的架构特点。”。然后我说了下cotexM3、 ARM9种架构,因为本人这方面没有系统的看过资料,也是一知半解,就大体说了下架构内包含什么东西。
然后面试官突然问我说ARM的全称是什么(Advanced RISC Machine),我纠结了一会说不知道,面试官笑了一下,然后继续说刚才听你讲的里面很多概念,我这列出了几个,请你解释一下。面试官纸上写了3个名 词:1、流水线 2、MMU 3、数据Cache和指令Cache ,这时面试官又问我流水线的英文是什么,我当时只记得是flow什么,我就说是flow
。。。。。面试官告诉我是pipeline,我说我没听过(回来后查了下流水线英文是flow line 或者pipeline都行)。然后我就流水线的问题说了一下,就是将预取指令,译码,执行阶段分开然后当第一条指令正在执行的时候,第二二条指令正在译 码,第三条指令正在预取,就是围绕这个说的。
对于第二个问题是MMU,内存管理单元,我说MMU可以在架构硬件上单独做一个,也可以把它做到协处理器中(s3c2440就是这样的),他主要用来完成 虚拟地址到物理地址之间相互转换。面试官又问还有什么其他功能,我说还可以对内存进行访问控制,比如我们把某块内存区域设置为了只读属性,如果我们的应用 程序对这块内存进行写操作的话,就会发生fault。
第三个问题上,我就说Cache是一个存取速度非常快的一小块内存,通常都是KB级别的,用来协调CPU和主存之间的速度不匹配的问题。Cache里面会 存放最近CPU使用过的数据和指令。面试官问这有什么好处?我说可以加快芯片的整体处理速度,当CPU取指令和数据的时候会现在Cache里查找,如果找 到就直接命中,把它取出来,如果没找到,则到主存里取出来,这样会慢一些。然后面试官又问这个数据和指令分开取有什么好处,和指令数据一起去相比又有什么 缺点。我下意识的就说可以提高处理效率,面试官又问就这么简单吗?我想了一会说分开去可以不混叠,面试官说嗯,那么是不是只有主内存上支持指令和数据分开 取才能达到让数据cache和指令cache的同时从内存去数据和指令,我想了会说不知道。面试官那好。
这时面试官拿起笔试试卷对第一个题这般查找说,当数组个数n很大的时候,如果在你刚才说的ARM9处理器上运行哪方面会产生效率上的影响(硬件上)。当 时没什么思路,就说了MCU的主频和里面用到了除法运算(网上都说斐波那契查找比折半查找快一点的原因)。面试官提示了一下,他说现在先考虑当n比较小的 情况,我又想了会还是不知道,面试官又接着提示,Cache会有什么影响?于是我说数组元素个数小的时候,数据能够全部放到数据Cache里,这样处理速 度回快很多;当n比较大的时候数组元素只有一部分在数据Cache里,会慢。面试官又说就这些吗?如果n太大cache满了怎么办?我想起来了就说,这会 涉及到cache的数据的置换算法,cache满了的时候,在cache又没有要找的数据,会根据某种算法把cache里的旧数据进行淘汰,再存入新数 据。然后面试就没有细究到底用什么算法(谢天谢地)。
最后面试官给我现场出了一个简单编程题让我写一下。就是找出2个字符串中都出现的字符,并返回,并给了我函数原型char *getstr(const char *str1, cosnt char *str2){}题目很简单,就是做一个数组,下标用字符的ascii码表示。
写完后面试官就让我去二面,但是那时时间已经6点半多了,然后就安排说离这较远的同学今天晚上先面试,其他附近的同学就明天上午过来二面,很不幸我被安排到第二天,而且是早上8点半。
回来之后,同学打电话说今天我们实验室一起吃饭认识一下 新一届的学弟学妹。没办法只能去,一直吃到9点多。回来后我觉得很有可能会问我面向对象和设计模式的问题,所以又连忙补了补设计模式(以前没看过)和面向 对象的内容。晚上在床上好长时间都没睡着,早上5点多又醒了,在床躺到6点半多起来去了实验室又看了会面向对象的东西。
8点多就过去面试了。
见到二面的面试官,面试官一直板着脸,面无表情,搞的我有些紧张。然后面试官又拿出之前笔试的试题,说你当时这个题使用2个for循环做的(汗颜),能想 一个更好的查找方法吗?我结果我的卷子看了一会,就想着用昨天数组下标的方法做,我说做一个26个大小的数组,然后。。。没等我说完面试官打断我说字符串 不光有字母数字,我一愣以为面试官说我的思路不对。面试官接着问我,a的ascii码是多少,我平时没刻意记过ascii码,都是用x-'a'类似的这种 方式做差值,所以没说出来,面试官又让我继续我的思路想。但是这时我的思路已经完全被面试官打乱了,以为刚才的方法不是最好的方案,于是又想了半天没有什 么进展,于是就胡乱说了什么二叉查找树之类的东西。面试官又说,既然你说到了二叉树了,那么请你写一下二叉树的广度遍历。我一听晕,自己平时都是用深度遍 历练习,广度遍历仅仅看过一次。于是我又开始纠结了半天,最后用栈写了二叉树的广度遍历。面试官问我栈是什么属性,我莫名其妙,说先进后出。(后来才想明 白面试官是提示我用队列,唉,自己的数据结构和算法方面太渣了)。面试官之后又问我知道大小端吗,我说知道。于是他让我写一个程序,把32为大端格式的数 据转化为小端格式的数据。于是我就用char指针和移位运算写了一个程序。但是面试官说我写的有问题,当时我觉得很对。然后面试官说看你简历上写着了解 linux内核,那谈谈你的对内核的认识。我就把自己学习linux的过程说了说,他说你里边提到了内存管理,那你说一下内存管理的算法有哪些?我说了下 伙伴算法的原理。面试官又问了快速排序的实现和时间复杂度。后来面试官说好了让我先回去等通知吧。嗯,意思就是说你没有过二面。
回来后我想了想大小端的问题,当时确实自己犯了错误,直接把4位数据当成一字节来用了,唉,当时已经完全昏了头了。我写了一下小端变大端的程序(大端到小端本质没什么区别):
总结这次面试:自己的数据结构基础不熟练,而且面试的时候受考官的影响,情绪上有波动,临场写程序分析问题的能力有待提高。还有就是要休息好才行。