首页 > 腾讯TEG AILab 一面二面HR 意向书 | 面试复盘
头像
无内鬼来个offer
编辑于 2021-08-28 12:30
+ 关注

腾讯TEG AILab 一面二面HR 意向书 | 面试复盘

腾讯TEG AILab 一面二面HR 意向书

写在前面:楼主是22届校招生,十分幸运能被腾讯录取,感觉三个月的准备没有白费。后续会把自己的笔记放到Gitbook中给大家开源共享,祝大家秋招顺利!

一面 50min

项目问题 -15min

主要涵盖了我项目的开发流程,主要职责还有工作量。挖到一半发现我答的还可以就停了

我是个Javaer,但是面试官说他们是C++, 所以就没有问Java八股,直接从MySQL开始问了

MySQL问题

说说InnoDB与MyISAM的区别

  1. InnoDB 支持事务,MyISAM 不支持事务
  2. InnoDB 支持外键,而 MyISAM 不支持
  3. InnoDB 是聚簇索引,MyISAM 是非聚簇索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB必须要有主键,通过主键索引效率很高。
  4. InnoDB 最小的锁粒度是行锁,MyISAM最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞
  5. InnoDB 不保存表的具体行数,而MyISAM会保存,所以MyISAM在执行select count(*)更快

说说聚簇索引和非聚簇索引

提示点:再说非聚簇索引的时候一定要提到回表查询

为什么用B+树当索引的数据结构?它跟B树相比,优点是什么?

在B+Tree中,所有数据节点都是按照键值大小存放在同一层的叶子结点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度

所以与B树的不同在于

  1. 非叶子节点只存储键值信息;
  2. 所有叶子节点之间都有一个链指针;
  3. 数据记录都存放在叶子节点中

我们知道IO次数取决于b+数的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则有h=㏒(m+1)N,当数据量N一定的情况下,m越大,h越小;而m = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低

UNION和UNION ALL的区别?

UNION和UNION ALL都是将两个结果集合并为一个,两个要联合的SQL语句 字段个数必须一样,而且字段类型要一致

  • UNION在进行表连接后会筛选掉重复的数据记录(效率较低),而UNION ALL则不会去掉重复的数据记录;
  • UNION会按照字段的顺序进行排序,而UNION ALL只是简单的将两个结果合并就返回;

Left Join 和Inner Join的区别

说说事务隔离级别

  • READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
  • READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
  • REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生
  • SERIALIZABLE(可串行化): 最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读

提到了幻读,从而引申出了MVCC

MVCC是怎么实现事务的安全性的

可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。大多数的MVCC都实现了非阻塞的读操作,写操作也只锁定必要的行。在MVCC并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read)。

提到了行级锁后,说说锁按照粒度的分类

说完了后面试官提问:InnoDB行锁是怎么实现的?

我听到这里愣了得有二十秒,没想明白。然后面试官又提到了表锁,灵感就来了。InnoDB行锁是通过给索引上的索引项加锁来实现的,InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。

MySQL八股结束,开始写题

算法题:括号匹配,但是我用的栈必须得自己实现。算法写的挺快的,手动实现栈想了一下,解决了。

二面 1h

上来直接写题:三选一。我选了第一道

给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。

找到所有出现两次的元素。

你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?

本来想用异或加位运算的,但是我这个算法不熟练。所以现场临时想了个类似于哈希的解法,就是数组中的值num对应的索引应该是num-1, 在操作完最后遍历的时候如果发现 这两个的值没有对应,那么它就是出现两次的元素

总得来说20分钟算是解决了,也写了测试语句通过了用例。

但是面试官好像没太看题,上来自己测试就往数组里加了个0,说我程序报错。给我吓一机灵,我提醒后,又往数组里加了个100,又说我报错哈哈,我没给他吓尿了。最后面试官嘟囔了句,这题限制还挺多,我只能应声附和。舔狗真是卑微..

写完之后继续项目,这次挖的比较彻底。从我们的市场调研开始说,动机是什么?每天的用户量有多少?数据库有多大?为什么用MySQL当数据库?为啥使用Mybatis Pagehelper? 怎么用Pagehelper? (现在还没有高并发的问题)-> 如果有高并发了怎么办?用什么解决?加什么东西?你觉得为什么可以?

这一套操作下来,面试官看我回答的还比较流利,就出了些分布式的场景题,具体问题有点忘了哈。大概是我上学期分布式数据库学过的算法往上套就行,但是我全还给老师了,只能现场硬说,跟阿杜一样--冷手硬打。有点痛苦

最后面试官说我们是C++哈,你Java可以转不?

那当然可以,必须可以,相当可以。我现场表忠心,“语言只是形式,关键还是思想,我自学能力很强的!”

面试结束以为自己凉了,结果当天晚上睡前就有TEG的HR姐姐加我微信了。我直接从书桌上起飞

HR面 30min

HR姐姐还是很温柔的

为啥要来腾讯?家是哪的?就是一些常规问题

然后又把我的项目唠了二十分钟

面完十分钟后云证加测评

周二HR面完 周五下午等来了Offer Call !!!!! 我也太开心了

以上就是我的流程,祝大家心想事成哈!

更多模拟面试

全部评论

(18) 回帖
加载中...
话题 回帖

相关热帖

近期热帖

近期精华帖

热门推荐