找实习的坎坷道路呀-腾讯篇

腾讯实习的招聘已经是很久的事了,为了不让这个系列草草收尾,我还是在假期里了结了它吧。这是“找实习”系列的终结篇了~ 其实早就找到实习了,只不过我喜欢做标题党~ [大笑] ~

腾讯实习招聘宣传的很早,所以我很早就网申了,不过当时投简历的时候投了Java方向(这方面也算小有修为),后来笔试的时候却阴差阳错的选了前端开发的JS方向~

网申要过应该很简单,有个靠谱的大学,有个靠谱的履历就可以了,学习成绩似乎都不用太高~

网申过了就是笔试。我的笔试是在4月23日上午10:00(翻手机记事本找到的~~),在大学城的华工。

 

笔试

笔试题目分为两个部分:基础、拓展。

基础部分大多是一些微机原理、计算机网络、操作系统、数据结构的知识,题目不难,就考基础。

基础的题目大部分忘了,不过……虽然数据结构掌握的还过得去,但计算机网络是忘的差不多了,操作系统略有了解,微机原理完全没学呀!!!! [抓狂] 悲催呀,有木有!!! [泪] 非计算机专业出身的孩子伤不起呀!!!有木有!!!

不过,我基础部分做的还是说的过去的~哈哈~ [偷笑] ~

总之,纵使代码能敲的噼啪响,基础部分还是需要扎实。

拓展部分题目就是当初网申时候选的方向,就一道题。不过所有方向的题目都印在一张卷上,想做啥都行。

我先说说Java的题目吧。

Java方向有两题,任选一题。第一道是关于Android的多线程,据说不难,可是我看到Android就直接忽略了~ 俺Java后来玩的是Struts2、Spring、Hibernate,估计腾讯中用Java来做Web的不多,SSH还是做商业项目比较有市场,于是果断忽略之。

然而我这忽略也忽略的太大了,木有看到Java还有第二题,是笔试结束之后别人告诉我的~ 伤感呀~ 第二题那个简单呀~ 我闭着眼睛都做出来了(主要是之前看过)~

 

第二题题目是这样的:

某花心男外面有了情妇,他的QQ上超过半数的聊天记录都是和那情妇对话,也就是说聊天记录中排除花心男自己讲的话之后,他情妇的聊天记录超过其他人的总和。很不巧,那个花心男的老婆通过特殊渠道取得了他老公的所有QQ聊天记录msgList(结构为LinkList,每个数组项包含属性qqNumber、content、time,约有几十万条数据),现在需要你编个程序把那个情妇的名字给找出来。

这个题目太特么喜感了~ QQ的聊天记录就这么容易被盗吗~ 是社会工程学的伟大?还是安全管家需要再接再厉?哈哈~

说白了,就是找出数组中出现次数超过半数的那个元素。这里假设msgList只包含情妇和其他人的记录(不包括花心男),因为直接删了花心男的数据也只需时间复杂度o(n),不影响。

解法一:

这是最容易想到的一种方法,也就是遍历msgList,用一个countMap记录每个qqNumber出现的次数,然后遍历countMap的keySet,找出出现次数最多的那个qqNumber。

这种方法的时间复杂度为o(n),空间复杂度为o(n)。

解法二:

虽然上面的算法时间复杂度已经是o(n),但是很费空间,因为n不是个小数目。另一种方法是对msgList的qqNumber进行快速排序,由于情妇的qqNumber出现超过半数,则排序后数组的中数必定是情妇的qqNumber~~~问题解决~~~~

这种方法的时间复杂度为o(nlogn),空间复杂度为o(1)。

解法三:

好吧,上面两种解法都很不错了,但还能有更好的吗?复杂度为o(n),空间复杂度为o(1)的?

答案是,有的。

每次在msgList里面删除两个不同qqNumber,直到无法再删为止。由于情妇的聊天记录超过半数,所以最后生还的qqNumber肯定是她的。

这种方法的时间复杂度为o(n),空间复杂度为o(1)。

 

这道题竟然被我雪亮雪亮的双眼给硬生生忽略了,悲剧呀~ 不过后面JS的题目很容易,就一题,好像是遍历一个table,找出某个td,然后改变它的style——我就是靠这题蒙混过关的~估计考的是对语法的熟练度。

 

于是,我就踏上了前端JS的道路。

 

一轮面试

笔试完之后,我就去市区玩了,很不幸晚上错过了地铁,然后决定和同学在外面通宵。更不幸的是,我在当天很晚的时候收到了第二天早上9点腾讯一面的通知~[泪] ~震精呀~ 改卷效率也太高了吧~

第二天一早就赶7点钟的地铁,赶到学校8点多,噼里啪啦刷牙洗脸换衣服,然后就“精神抖擞”的奔向面试地点(好在离学校近)

面试地点是在华工酒店的客房里,环境蛮不错的(腾讯那几天把华工酒店的几层楼都给包了~有米)。面试我的是一个GG,年轻俊气的脸庞,温文尔雅,蓝色的Polo衫彰显着青春的激情与活力(拍个马屁,哈~)

他像聊家常一样和我聊,主要通过我自我介绍的内容来不断挖掘更深的信息,各种技术社团、项目经历,不过没有很深的去探讨技术细节的东西。

后面聊开了就问我在前端开发方面的了解和积累。我就开始吹了(不过都是靠谱的吹),说了一些自己对前端工作的看法;说我平时很喜欢了解一些关于前端开发的理论与实践,一直有订阅博客的习惯,经常看UCDChina、腾讯CDC、淘宝UED的博客;还说有看过jQuery的源码,了解了它的实现方法;还说了自己在前端方面的一些小作品(真的很小~)……

虽然以前一直有接触前端的技术,也很感兴趣,弄过一些小作品,可是一直没有花大力气去研究。那个GG人很好,没有怎么为难我,如果那个时候考我一些JS的难题我还真不一定能过~

最后,他问我有什么问题问他,这个时候我囧了~ 木有想过~ 最后灵光一闪,问了一下他前端开发人员的职业规划,以及和后台开发人员的对比(后台开发以后可以有很多深入研究的方向,例如移动互联网、云计算、数据挖掘等,那前端开发人员的技术突破点在哪?)。虽然当初他的答案我不是很满意,但是我现在似乎已经找到了自己那个问题的答案。

他似乎对我印象很好,走的时候跟我握握手,暗示我“应该没问题了”。

回宿舍,倒头大睡~

 

二轮面试

一面后的第二天晚上,我收到了二面的通知,时间是26日上午10:00。

面试我的是一个中年男人,估计是中层领导。他面试过程中一直满脸笑容,讲话和蔼,但总让我觉得有点笑面虎~哈哈~

他问的问题主要是结合自我介绍和简历来问。他会不断深究你讲的项目内容,例如对你影响最大的项目是哪个,在这个项目中做了什么,怎么分工合作,遇到最大的难题是什么,怎么解决,从中学到什么,这个项目对你以后的项目有什么影响等等。

问完项目之后,话锋一转,问我有木有学过C++——我说有,不过很久没用了,主要用Java。他又问,有木有学过数据结构——我说有。然后就出了道算法题考我,给了我纸和笔。

直接上题:

有个几十万个节点的单向链表,你如何判断它是否带环,如何找出环开始的节点。

腾讯面试的算法题

这道题看起来简单,不过还是要想一阵子的,如果要找到比较优化的解法也不容易。好在,我之前做过~~

第一小问:

最简单的想法就是遍历链表,记录每个结点出现的次数,如果有结点重复出现,说明有环。

不过这个方法的很占空间,正确的做法是从链表头部放两个不同速度的指针(p、q)去遍历链表,p每次走一个节点,q每次走两个节点。

如果q到了链表尾,则说明不存在环;如果存在环,由于q的速度比p快,当p进入环内之后,q必定会从后面超过p,然后和p重合,两个指针重合则说明有环。

当p进入环内时,p和q之间的距离必定小于环的长度L,则L步之内p、q必定能重合,所以时间复杂度为o(n),空间复杂度为o(1)。

第二小问:

这就是个数学问题了,先说解法:设p、q相遇处为X,让p从x处开始,q从链表头结点开始,每步都走一个节点,相遇处则为环的开始节点。

原理如下:

设头结点到环开始点H的距离为h,环的长度为l,链表长度为L=h+l。分为两种情况考虑,一种是l>h,一种是l<h,前者比较容易明白,弄明白前者,后者也就好懂了。我就只说第一种情况的,l>h。

当p到达H时,q已经走了2h,此时p、q都已经进入环中。由于p、q速度不同,他们形成追赶,q到p的距离为l-h,也就是还要走l-h步才能相遇。设相遇点为X,则p从头结点到X走了l=h+(l-h)步,则离环的开始节点还有h=L-l的距离,也就是和头结点到环开始节点的距离一样

后一种情况,l<h,只需将余数h%l弄清楚就可以了。

 

幸好之前做过,思路理顺了,不过也还是花了点时间的。期间面试官会各种打岔,问你各种性能,复杂度,有没其他解法的问题。

然后还问了一些个人兴趣爱好,有没女友,家庭情况,人生规划的问题。

然后是杀手级问题:我有什么问题问他~~~再次无语凝咽~~~又是用一面的问题混过去了~~~

最后握握手,say good bye,就回去等三面通知了~~

总之呢,平时多看书,多思考,多积累~~~

 

三轮面试

三面等的就相对比较久,好像是29号上午11:00去面的,是HR面,也就是最后一面了~

那个HR面无表情,寡言少语,眼睛只看电脑,我那个压力呀~

不过问的问题都是兴趣爱好,有没女友,家庭情况,人生规划……只要没大漏子就行了……(据说有个大牛开口就是“我以后要出国”~ [吃惊]

问了十来分钟,就say good bye了,饿了吃饭去~

 

等通知及其他

据说进了3面的大部分都能获得实习机会,所以我回去就没多想了,坐等消息。不过一等就等了小半个月,5月10号才收到录用函。

实习期至少两个月,各种福利待遇还不错:每月有1400住房补贴(差不多够吃够住),有一次性600来回路费(省内),而且刚到的时候还有15天的酒店住宿(据说4星级),还有每月还有“业内富有竞争力的实习工资”。

 

这次腾讯的笔试面试还是蛮顺利的,而且腾讯还是我心目中非常向往的企业,实习开始之后一定会努力的!

 

我说:离实习开始没几天了,期待呀~

 

发布者

Rolf

伪文艺IT攻城师,热爱前端,热爱互联。

《找实习的坎坷道路呀-腾讯篇》有12个想法

  1. 前端开发人员的职业规划,以及和后台开发人员的对比(后台开发以后可以有很多深入研究的方向,例如移动互联网、云计算、数据挖掘等,那前端开发人员的技术突破点在哪? [可怜] 求解答

    1. @苏淦 其实我们所谓的“前端”“后端”并没有太大的差异,都只是程序代码而已。

      真正有差异的东西叫做“做应用”和“做学术”。“做应用”要求的能力较为广泛,涉及项目的方方面面。前端技术人员一般是属于“做应用”的,技术突破点主要在于代码的性能,用户的体验,团队交流合作的能力。对于“做学术”嘛,关键不在于写代码的技术,更重要的是在学术领域的深度,对数学、算法的要求应该就比较高了。

      个人是觉得“做应用”比较酷,比较开心,也就打算一条路到黑了……

  2. 楼主可以把“几十万链表”这道题的另一种情况写下吗?或者可以方便告诉这道题的参考链接或参考书吗?谢谢啦。!!majianbin24@126.com期待你的答复。。

    1. @风青 这道题我在《编程之美》里面看过,不过也是作为扩展部分,没有答案的。《编程之美》这本书挺不错,可以开拓一下思维。同时也推荐一下《编程珠玑》这本书,两本弄清楚其中之一就不错了。

      1. 应该谢谢你的分享。还有疑问“设p、q相遇处为X,让p从x处开始,q从链表头结点开始”,一开始假设p走一个,q走两个。x距离H也不知道,那距离怎么能是2h-h?

        1. @hairongtian 不要陷入我的描述当中了,可能我表达的不是很得当,要把这样的逻辑问题表达清楚不容易,但是跟着这个思路画画图,我相信你能想出来的。推荐你看《编程之美》这本书。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

[喜欢] [嘻嘻] [奋斗] [问号] [鼓掌] [泪] [酷] [强] [耶] [握手] [心] [给力] [神马] [围观] [奥特曼] more »