腾讯面试经验 2

【回复“1024”,送你一个特别推送】


原文作者:Christal_R

原文地址:http://www.cnblogs.com/Christal-R/p/7691375.html

特别声明:本文为Christal_R原创并授权发布,未经原作者允许请勿转载,转载请联系原作者

时间:2017 年 10 月 16 日 11:30 面试。

地点:重庆万达艾美酒店。

信息:女,本科应届生,面试后台开发岗位。

在深圳的面试已经全部结束了,偶然间听朋友说重庆、长沙等场地的面试还在进行中,只要修改面试地点,仍然有机会拿到面试机会。所以我抱着试一试的心态,在腾讯校招官网上修改面试地点为重庆。10 月 13 日中午收到了腾讯的面试通知,面试时间是 10 月 16 日 11:30,面试地点在重庆万达艾美酒店。

收到短信通知的那一刻就已经有点紧张了,一开始我也很犹豫到底要不要跑回重庆去面试,电话里我爸说我既然那么喜欢腾讯,就应该抓住每一次机会去尝试,不看结果,至少我们经历过嘛。所以 14 日一大早就买上了 15 早上飞往重庆的机票。我也不断提醒自己,紧张只会影响发挥,就当自己是回重庆改善饮食、度度假的。抱着这种心态,一直到走进万达艾美酒店之前我都再没有任何的紧张感。当酒店正门在视野中出现的那一刻还是忍不住紧张,所以我努力使自己保持微笑,一有机会就跟身边的人闲聊,渐渐熟悉周围环境之后也就忘记紧张这个名词了。

电梯里遇到两个小哥哥,两个都是面试产品经理的,其中一个也是跟我一样来自深圳,酒店服务员让我们来到 4 楼,一出电梯就看到一组二维放置的椅子,里面稀稀落落的坐了不少来面试的,他们全是霸面的,凡事有正式通知面试的同学直接被送到里面房间扫码签到等待。跟我带路的是腾讯的小哥哥,面带微笑询问我是面试什么岗位,我说后台,他脸上的表情很丰富,非常惊讶我作为一个女生来面后台!我说我是本科生,他的表情更加夸张了...... 惊讶转佩服,他估计是佩服我的勇气,说看好我并未我加油。

签到后,里面房间的位置也就坐着一个同学在等待面试,我径直走到他旁边的位置坐下,主动跟他搭话,他是面试前端的研究生,一边跟我说着话一边不停地敲着键盘,看他很专心地在研究他的代码,我也就没再打扰了。静坐了一分钟左右,又进来一个男生,坐在我们后面的位置,主动向我们两个搭话,他是来复试后台的重庆大学研究生,旁边男生一听是后台,立马让我跟他好好交流,我也很识趣地移到后面男生的旁边坐下。这个男生很 nice,得知我是本科生,看了看我的简历,然后向我分享了他的经历——他在本科毕业之后也向我一样来面试了腾讯,但是被拒,拖了一年后开始准备考研,考了两次之后成功考上了重庆大学的研究生,直到现在他自己手上已经有其他公司的 offer,然后再来面试腾讯。言语之间已经感受到他十足的信心了。可能觉得这个时候的我很像当年的他,所以给了我很多建议。还没来得及互相留联系方式,他就被叫去面试了。他走后立马又来了一个复试后台的重庆邮电研究生,坐在我旁边,得知我是一面且是本科生,不再感兴趣,于是掏出手机开始看资料,一边看一边告诉我让我看看 XXX,一面可能会被问到。不怕丢脸,讲真的,他说的那两个名词我都没听过...... 这也许就是本科生和三年研究生的差距吧!

终于轮到我面试了,地点是 7 楼,走出等候室,仍然是刚刚的小哥哥给我带路,帮我刷卡按电梯,并一直夸赞和鼓励我,我苦笑一句说我自己也觉得很意外,而且我看过来面试的都是研究生,他很温柔地告诉我没关系,面试官对研究生的要求和本科生的要求是不一样的哦~最后送了我一个微笑和好运祝福后让我关上了电梯门。

电梯到达 7 楼,做了一次深呼吸后,我面带微笑走进了 726 房间,面试房间的布局和我想象中的一样,面试官的状态也和我想象中的一样 —— 一副刚起床的状态!面试官坐在书桌的电脑前等我的到来,我在走向他的途中用余光扫到旁边床上被子是凌乱的,床边他的靴子东倒西歪并向外吐着袜子,床头柜上还有打开未吃完的薯片。面试官看起来没有很好相处,我会这么觉得,大概是因为他没有回应我的微笑吧。从进门开始我就介绍了我自己的名字,并一直面带微笑。

面对着他坐下后,首先被要求做个简单的自我介绍,名字+大学+专业,然后说明我是深圳过来重庆面试的,他很惊讶我来自深圳,同时也很好奇,我原本以为他是知道我 9 月份在深圳已经面试过的,而且对于每个已经面试过的同学面试官都会写一份评语,我也以为他已经看过评语,看他的反应大概是什么都不知道,所以我做了一个详细的说明之后便接着我的自我介绍模版说下去。待我说完,他估计是看到了之前面试官对我的评语之类的,没有再问我简历上的内容,直奔主题——做题!一共做了三道题。

  第一题  合并多个有序数组

第一道题是算法设计题:有 N 个数组,每个数组有 M 个元素且呈升序,求这 N 个数组的并集。例如:第一个数组有{1,2,3},第二个数组有{2,3,5},则合并后为{1,2,3,5}。

(1)我首先想到的是牺牲空间节约时间的办法,申请一个超大的数组 A,初始化为 0,遍历这 N 和数组,将元素作为 A 数组的下标访问 A 数组并置 1;N 个数组访问结束之后,再遍历一次 A 数组,其中值为 1 的下标的集合就是合并后的结果。听我讲完,他首先问我时间复杂度和空间复杂度,时间复杂度是 O(N*M),空间复杂度是元素的取值范围。面试官提示我本道题是在 64 位系统下实现,而我需要的空间大小为元素取值的范围,也就是说最多能达到 2^64 远大于 1Gb,所以这个方法是不可行的。

(2)我知道我一直没有利用到 “有序” 这个关键词,所以我抓紧这关键词,首先想到的是二分查找:以两个数组 A、B 合并为例,以 A 数组为基准,遍历 B 数组的元素,利用二分查找,将 B 的元素在 A 中找到最适合的位置,

  • 若 A 中不存在且处于 A 数组下标为 0 的位置,则直接记录该 B 数组的元素;

  • 若 A 中不存在且处于 A 数组末尾,则返回整个 A 数组+该 B 数组元素;

  • 若 A 中存在且此处 A 的元素和该 B 数组的元素不等,则返回此处及其此处以前的 A 元素+该 B 数组的元素;

  • 若 A 中存在且此处 A 的元素和该 B 数组的元素想等,则返回此处及其此处以前的 A 元素。

说完思路,他接着问我,那 N 个数组怎么合并呢,我回答的是递归拆分,直到只剩两个数组为止,然后再逐次往上合并。回答完递归后,我自己都觉得太过复杂了。他继续问了下时间和空间复杂度,两个数组合并的时间复杂度主要取决于二分查找的复杂度 O(logM),总共要找 M 个关键字,所以两个数组合并的复杂度是 O(MlogM),再加上 N 的数组的递归拆分大概就是 O(N*MlogM) 的复杂度了,空间复杂度为常数。能由 “有序” 关键词想到了二分查找,面试官也勉勉强强接受了。

(3)我看他的表情不太满意,于是我主动表现出对巧妙方法的兴趣与渴望,于是面试官就给了我一个提示:“就以你两个数组为例,你每次无非就是在确认一个数。” 灵光一闪!我知道了!

  • 用两个指针指向这两个数组的头节点,指针内容进行比较,

  • 如果内容相等,则记录其中一个元素,两个指针同时向后移动一个位置;

  • 如果第一个小,记录该元素,该指针向后移动;

  • 如果第一个大,记录另一指针指向的元素,另一指针向后移动。

那么 N 个呢?递归的话容易实现,但不一定是最好的,如果每个数组一个指针会不会空间太大呢?只有 N 个数组,只需要 N 个指针,N 个指针同时进行比较,每次找最小的一个数记录(问题简化了,相当于在 N 个数中寻找最小的一个数)。显然 N 的指针更佳令人满意。那这 N 的指针如何进行比较?我先说的是快排的拆分函数(以一个数为基准,比该数小的在左边、大的在右边),而这个基准数是随机的,所以调用一次拆分函数,返回函数中基准值下标,如果下标大于 1,再对下标的左边部分继续调用函数;如果下标小于等于 1,直接返回下标为 0 的元素。这样的做法减少了递归次数,不必使得整个序列有序。但是这个做法还是不能让面试官满意。N 个数中,只是找一个最小的数,我还能想到的是堆,但是我对于堆不熟悉,只知道当记录数很多的时候用堆最合适。我也是这样同跟面试官说的,最后再次问了时间和空间的复杂度,我理解的堆排序时间复杂度是 O(nlogn),但是这个复杂度是将整个序列变得有序的复杂度,而我们只需要找一个最小的,所以我的回答是,若堆排序的时间复杂度是 X,那么这种解法的时间复杂度是 O(NMX),空间复杂度为常数。

  第二题  回文数函数实现

第二道题是写代码,让我写出回文数的代码实现,给了我一个函数的定义,让我实现该函数。当然我会故意问一位数的数字算不算回文数!这道题没什么难度,所以我不慌不忙地写,也把所有边界情况都考虑到位。写了一个最简单的代码:

后来仔细想想以前的代码,还有更简单不易错的代码:

  第三题  服务器压力测试设计

第三道题他说是设计题,让我设计一种方法来测试服务器的压力,听完他的题目说明,我是一脸萌比的,大概是问的 “假设:服务器 tps=100000,怎么测试服务器压力”,很尴尬的向他求助,能不能给点提示,他又说 “假设一个线程 tps=1000”,结合他的提示,我只能把与相关的知识全部说出来,如线程的通信方式:(1)管道(2)系统 IPC(信号量、、消息队列)(3)套接字 Socket,其中漏了一个,因为这个问题毫无头绪,我已经有点着急了,接着继续说,要想达到 100000 的 tps,肯定需要多个线程,我想用信号量来实现,例如我 100 个进程就能达到想要的 tps 的话,我给这些进程 100 个锁来实现。他忍不了,说用共享内存来实现多个进程的通信更快,我恍然大悟,哦!!我遗漏了共享内存...... 我急忙赞同他的说法,他又接着问我这多的线程要怎么管理呢?这... 我只能认输不知道。他告诉我,需要用一个线程来管理其他多线程的并发操作。

后来自己百度了下这个问题,原来是 WeTest 的测试大师 http://wetest.qq.com/gaps/

三个问题问完之后,对于面试结果,我心里还是有点 B 数的,面试官并没有走流程让我问他问题,说今天的面试就到此吧。我起身拿起包打算离开,但还是很像问他问题,所以我先问他我能否向他提一个问题,他同意之后,我问他我们这样的本科应届生有什么建议和意见吗?他还是很耐心的跟我讲了一些对应届本科生的建议,最后说我阅历太少,经验不够,基础功不扎实。我回应了几句,并向他表示了真心的感谢之后离开了房间。

面试官的评价很到位,赤裸裸的现实,还是回校补补营养吧!不过这份经历还是值的,一个毫无经验的应届本科生同几个研究生来竞争同样的职位,虽然结果很明显,但还是非常感谢面试官给我这个面试机会,而且整个面试过程中还那么耐心的引导我!

友情提示,这一篇文章是作者第二次面试腾讯的经验,如果想看第一次腾讯的面试经验,欢迎大家去看二栏中的文章。继续去学习大公司的面试经验和套路。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
腾讯面试题中的 "从0到1" 是一个常见的问题,它意味着从零开始建立一个完整的系统或项目。这个问题的目的是考察你在实践中解决问题的能力以及你对整个流程的理解。 回答这个问题时,你可以按照以下步骤进行: 1. 理解需求:首先,你需要明确你要构建的系统或项目的需求是什么。这包括功能需求、性能需求和用户需求等。你可以通过与相关人员沟通和分析市场情况来获取这些需求。 2. 规划和设计:在明确需求后,你需要进行系统的规划和设计。这包括确定系统的整体架构、模块划分、技术选型等。在这个阶段,你需要考虑到系统的可扩展性、可维护性和可测试性等方面。 3. 开发和实现:在规划和设计完成后,你可以开始具体的开发工作。这包括编写代码、实现功能、进行单元测试和集成测试等。在这个阶段,你需要根据需求和设计进行迭代开发,并及时调整和修复问题。 4. 验收和部署:完成开发后,你需要进行系统的验收和部署工作。这包括与用户或相关人员进行沟通,确保系统满足需求,并进行正式部署。在这个阶段,你需要进行系统的功能测试、性能测试和安全性评估等。 5. 运维和优化:系统上线后,你需要进行系统的监控和运维工作。这包括监测系统的运行状态、处理用户反馈和进行系统的优化和升级等。 总结起来,从0到1的过程是一个从需求理解到系统部署运行的全过程,需要综合考虑各种因素,包括技术、设计、开发、测试、运维等。在回答面试题时,你可以根据你的实际经验和项目经历来展示你的能力和经验

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值