一位编程学长面试经历.docxVIP

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一位编程学长面试经历

签了Offer按理说应该发个帖子庆祝一下,但是我实在是没有那个兴致。如今正好大伙都放假,那么我也来说说我的面试经历吧。话说我虽然不说才高八斗,但是至少在计算机方面还是比较有信心的。至少没感觉到身边有哪些人明显比我水平高。或许是我身边的人都深藏不露也说不定。但是总而言之吧,我一上来自信心还是很足的。于是乎没怎么准备,就投出了简历。最初的面试是Google。当时谷歌的面试题目很简单,就是二叉树的后序遍历。当然,简单归简单,只是我当时犯了一个重大错误,就是明明一个if选择条件语句可以解决的问题,我习惯性的一下子一个while就上去了。由于与其他搜索树的结构不同,相对简单的二叉树并不需要明确的广度终止条件,所以当我写完了之后,才发现是个死循环。当然咯,面试官随口一说,我也就发现了。只不过这面试就Failed了。经历过出师不利之后,我痛定思痛,集中准备了几天,然后就又出征了,可是万万没想到的是,我的噩梦才刚刚开始。由于是毕业季临近,所以我很快就得到了第二个面试机会.这次面试的题目是:进程和线程有什么不同?我信心满满的回答:线程之间可以共享部分内存,而进程之间不可以。面试官说:还有呢?我一愣,这怎么还有啊?于是我硬着头皮说:在调度上,或许Windows的线程调度会与Linux有所不同,说不定Windows下面线程之间的切换要快一点。我这么说自然是有道理的。因为微软的操作系统是不开源的,我只能凭着经验去猜测。在Linux下面,线程的调度和进程是一样的,也就是说Linux在调度的时候对进程和线程不会加以区分。面试官听过之后说:还有呢?我:没了吧。就这些了。面试官:不对,还有。我:真没了。要不你告诉我还有什么区别?当然,说道这里我已经比较生气了,因为这已经近乎无厘头了。但是面试官似乎并不饶我,继续用一种居高临下的问询的眼光看着我说道:答案我不能告诉你,但是还有,你仔细想想。我这下真的有些愤怒了,于是我说:-我不知道Windows下面是怎么弄的,但是Linux下面我可以跟你来说一说。Linux本身没有进程和线程的区分,唯一的区别是在进行fork系统调用的时候,你可以设置是否复制全部内存,部分内存和不复制任何内存。复制全部内存的话就是我们熟知的进程复制;复制和共享部分内存就相当于一个线程;不复制内存的话一般后面紧跟exec系统调用,是用来启动一个新程序的。Linux在进行fork的时候,使用了copy-on-write的机制,可以降低对于内存写入的次数,提高效率。但是具体到任务表示上面,进程和线程并无不同,内核也不会进行特殊的关照。我说到这里顿了顿,看到面试官依然没有发言,于是我接着说:-那么现在请你告诉我,除了共享内存之外,线程和进程之间有什么不同?我说完了之后就盯着面试官看,因为我实在是不知道这种明确到1+1=2一样的知识搞得那么高深莫测有什么意思。面试官避开我的眼神,嘴上说着:还有其他的不同。面试以不愉快结束,我又fail了。当然,我的征程还远没有结束,很快我就又迎来了一次施展拳脚的机会。这次面试官问的问题是:有m个已经排好序的数组,每个数组有n个数字。现在想要让你把这m个数组合并成一个大数组,数组是排好序的。我听过之后微微一笑,因为这个问题其实并不难。我仰起头想了想,说:m*n*log(m)。面试官问:什么?我说:时间复杂度是m*n*log(m)。面试官:你怎么实现呢?我:用一个堆再加一个数组。根据那m个数组的数据结构,或许还需要另一个大小为m的数组来记录下标。这时候我觉得这个问题可以结束了,已经没什么可多说的了。可是万万没想到啊,很多面试官其实每次就准备一个题目,你很快得出结论的话,面试官就得想方设法让你撑满整个的面试时间。于是就有了下面的对话。面试官:你确定是最优解了么?我:我确定面试官:你再想想?我:是m个数组吧?面试官:是的我:每个数组有n个数字?面试官:是的我:m*n*log(m),这就是最优解了。面试官:你不尝试着换个思路?我:难道是分布式?或者是Hash排序?面试官想了想:不是。这下我心里真发毛了。因为我断然想象不出来亚马逊有什么逆天的科技能够做出比这种解法更优化的解法,但是看着面试官“慈祥”的笑容,我决定试一下另外一个法子。我用了所谓的“逆二分法”。这个做法还是我被逼无奈当时临场创造出来的,数据结构复杂不说,最后的时间复杂度依然是m*n*log(m)。而且为了排序方便,我使用了红黑树。当我写下rb_node的时候,面试官都惊呆了。面试官问:这是什么?我:这是Linux内核当中的红黑树结构。面试官:能用么?我:能面试官:你确定?我:是得用到点技巧,但是可以用在普通程序之中。当然,直到时间最后,我还有一点小尾巴没有写完,面试结束,我又fail了。当然,我还有机会。可是万万没想到啊,后来的面试官一上来一个问题就是:请实现一个缓存。

文档评论(0)

bokegood + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档