“三顾字节”,九次面试,只要算法搞得好,大厂offer跑不了

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 4.29 字节春招截止倒数第二天,杭州Java商业变现部门暑假实习,隔天挂,春招结束(人生的第一份简历,嗯就开始即结束

先说说我与字节的那些事

4.29 字节春招截止倒数第二天,杭州Java商业变现部门暑假实习,隔天挂,春招结束(人生的第一份简历,嗯就开始即结束

6.15 字节提前批开始的前一天,杭州飞书日常实习部门,隔天挂,实习结束

6.19 收到字节笔试邀请,才知道原来求职有【捞】这个操作,果断参加,迎来人生的第一次笔试 => 0ac(实在不会用Java的输入输出。。。),后来第二波笔试ac2.x

6.29 收到了hr的电话通知面试通过开始约面试,于是长达半个月的三面开始与结束,最后三面挂了哈哈哈

中间被北京鞭尸两次,都拒了,后又被深圳捞起来,hr小哥哥说可以考虑是一次新的机会,我就答应了。

一个插曲:

我:我现在在厦门实习

hr:厦门美团吗?

我(连忙):小公司小公司小公司(最怕空气突然安静)


没想到今晚直接面完两面,字节的效率和面试官的态度就我个人而言,五面的经历都很不错,会引导,也不会非常严肃,我第一次面试的那个面试官应该是最严肃的了 然后我个人不喜欢录音,通常都是靠记忆来复盘的,这次直接两面我脑容量有点不够,我的脑子不太会响应缺页中断,主要是因为饿了,没吃晚饭,所以会乱序+遗漏就不要在意了

可能是因为很缺人吧,两面都是 半小时基础 + 半小时算法,没有挖项目,有三面的话应该是会问项目了吧(发抖 )

一面 19:30 - 20:30

1. 自我介绍2. 类的生命周期 (我在字节终于被问了Java基础,天啦噜) 加载 -> 验证(符合规范约束,不会对虚拟机有危害)-> 准备(类变量/静态变量赋零值,静态常量赋初始值)-> 解析(符号引用替换直接引用)-> 初始化(类变量赋初始值blablabla) -> 使用 -> 卸载

3. 符号引用和直接引用 果然给自己挖了坑,我说符号引用可以是任何形式的字面量,与内存布局无关,加载的时候拼接(这里有问题)起来能定位到目标对象;直接引用就相当于直接指向目标的指针,与内存布局有关。 面试官表示不理解,要我再讲一下符号引用,我之前看过公开课讲过符号引用转变为直接引用的过程,但是印象不深了,就说他是常量池里通过指令后有个什么指向什么的说乱了,最后坦白说我自己也有点乱就先过了。

4. 类加载机制?这么设计的好处?怎么实现打破? 昨天网易二面刚问过类加载模型,我就把双亲委派和哪几种类加载器都说了。 好处是一个安全(防止用户自定义的类覆盖基础类),一个防止类被重复加载。

打破我说的是线程上下文类加载器,就是引入线程上下文类加载器(通过 Thread 类的setContextClassLoader()方法设置类加载器),通过父类加载器去请求子类加载器来完成类的加载。不过我只记得是叫线程上下文类加载了,忘了是通过设置类加载器来打破,所以面试官就问我说这难道不是一种新的类加载器吗,我说不是,只是在加载的时候可以通过他来改变,面试官表示不解,我表示忘了。于是过。

5. 你们都是使用的spring框架是吧,讲讲框架初始化的过程吧 我表示自己只看过bean加载和aop的源码(实际上事务管理也看了,但我忘得差不多了不敢挖坑),于是就说能不能讲bean加载的过程,表示ok。于是就把bean加载的整个主要的流程说了一通 解析beanname=》单例池找单例(三层缓存)=》单例bean的创建=》记录加载状态(放进map)=》实例化前置处理(BeanPostProcessor接口,顺便说了下aop的代理加强就是在这里判断实现的,有个aop的BeanPostProcessor)=》提前曝光(三个条件:单例 + allowEarlyReference + 正在加载中,都成立就提前曝光自己的ObjectFactory放到第三层缓存里)=》属性填充(讲了下循环依赖)=》移除加载状态(从map里去掉)

其实还有根据构造器构造的部分,我记不清了就没提,避免挖坑(

6. spring怎么选代理方式? 实现接口默认jdk动态代理,没有实现默认cglib,前者通过实现类,后者通过继承,也可以通过proxy-class-target来指定使用cglib。然后他好像想接着问的,不过还是说过了,可能是想挖深一点吧。

7. 数据库的隔离级别d 读未提交(脏读),读已提交(不可重复读),可重复读(幻读),串行化。

这里有点好玩,实际上幻读我一开始说的是【幻行】,然后他就问我【幻行】是什么,我一下子没反应过来,就说是一个事务内两次select多出了不存在的行,他说噢【幻读】啊,然后我才反应过来,说噢噢噢【幻读】是一种现象,【幻行】就是多出来的行hhh

8. 怎么做到可重复读? 我说可以通过mvcc来解决,以及mvcc在可重复读下可以优化幻读问题。请注意:RR级别下不能完美解决幻读问题哈,mvcc也不行,也别跟我说next-key算法,手动加锁那算是存储引擎自己主动干的事吗,不算!毕竟飞书一面被面试官质疑过,写过博客,可以参考
https://blog.csdn.net/weixin_42907817/article/details/107121470 不过写的不咋好哈,随手记录罢了。 然后就讲了mvcc的原理,讲了两个隐藏列,事务id和指向undo log的指针:事务A快照读后,事务B启动并提交了insert操作,这个时候这条记录的事务id指向事务B,事务A再执行快照读时不会把它纳入结果,因为事务B的id大于事务A的id,根据undo log回滚发现这条记录他本就不存在。但是如果此时事务A执行的操作比如说update覆盖到了这条insert的记录,那这条记录的事务id就会指向事务A,此时事务A再次执行快照读的时候就会发生幻读现象了。

================================= 手动分割线:下面9、11、12、13的回答是有问题的,题目本身我记得也不清楚了,就不说自己的回答了,当然了看客们知道的能不能留下正解 (拜托啦这对我真的很重要 ==================================

9. update操作不会判断事务指针吗? 说了不会,实际上这里我也有点疑惑,挖个坑好了,之前一个小伙伴跟我说是update是会执行当前都然后上写锁,我觉得有点不对劲,待解决。

10. undo log是用来做什么的?事务提交的时候会提交什么日志? undo log是用来实现回滚和mvcc的。事务在执行过程中会不断写入redo log buffer,然后满足策略(三个策略供选择:交给master thread;buffer只剩一半的空间;事务提交)的时候会写入redo log file,以及提交的时候会写入binlog。

11. redo和bin的提交顺序呢?

12. undo log 和 redo log的区别?分别记录了什么?binlog呢? undo log是存储引擎层的日志,是一种逻辑日志,记录的可以说是一个反逻辑的sql;binlog是数据库层次的日志,记录了对数据库增删改的sql;redo log也是存储引擎层的日志,但是是物理日志,然后记录了什么我一下子忘了就说了不知道,实际上应该是记录了对数据页的修改吗?

13. 数据库会把数据持久化到磁盘为什么还要redo log来做持久化? 这个其实是我前面的表述问题,redo log是做事务持久化的,是我没注意到。

14. 算法 力扣原题:82.删除排序链表中的重复元素II,我以为我做过的,实际上搜到的时候现显示没有提交记录(?


https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/

一开始想一次遍历来做,发现总是绕不开,就改用递归了,跟面试官先说了思路后写了主要逻辑,然后通过。

中间有两个小插曲,一个是一开始编译总是过不去显示非法字符,我以为是输入输出有问题,最后面试官提醒我说你用了中文的分号

还有一个是可能一开始hr没沟通好,我做题做到一般面试官突然下线然后二面面试官上来了,跟我说你是来应聘后端开发工程师的吧blablabla,我说是,然后我说我有个问题:我刚刚才面试到一半,还在做题呢

15. 反问 万年不变的问您觉得这里的工作氛围如何?

面试官说突然问这么广啊,我觉得还好吧就互联网公司嘛,身边年轻人也挺多的,压力也挺大,每天有做不完的需求

二面 20:30 - 21:30

解释了下刚刚提前上线的情况,然后说我们重新认识一下 二面真的记不清了,比较基础的题我也就不详细写了哈。

1. 自我介绍

2. 你们这个灭菌器的项目有多少人会使用的? 我说这还不清楚,还没上线。

然后问我说你们本科就有导师的嘛,有自己的实验室嘛?我说是,不过我们就是普通的工作室。(因为我有三个跟导师的项目(其实都是crud(小声bb

3. 不知道的情况下就使用了redis 因为!要!写进简历里的嘛!(内心os

因为灭菌器他有很多的一些固定的参数,是不会修改的,所以走了redis

4. 有考虑过使用其他的,比如使用配置文件来存储吗? 没有(也没太懂?

5. 缓存更新是怎么更新的呢? 先写库后删缓存,读的时候先读缓存没有就读库然后更新(这里我只是说了我项目里怎么做的,因为没有需要实现强一致性

6. redis的数据是存储在哪里的?内存,也可以持久化到磁盘。持久化方式?rdb快照,aof日志。 7. 知道redis的主从选举嘛? 我说我只知道主从的原理,就讲了主从复制的原理过程。旧版的sync和新版的psync,完整重同步和部分重同步。

8. 有使用过redis的过期时间吗?怎么实现的? 我说我简单使用过,然后我以为他是要我说实现的原理,就说了不知道,他就说如果让我实现我会怎么实现,我说会设置定时器,然后优化不出来就过了。 最后我才知道原来他问的其实就是删除策略,也就是惰性删除和定期删除,不是原理,可惜了。

9. 知道sql注入吗?怎么解决的呢? 讲了讲字符串拼接的sql,举了用户登录的例子。然后说mybatis的preparestatement可以解决,也就是通过预编译语句。 10. 软件专业学过计网的吧,说说tcp和udp的区别?哪一层的协议?我们现在面试用的哪个?http用的哪个?11. tcp提到了流量控制和拥塞控制,说说区别? 流量控制是一对一,防止发送方发的太快接收方来不及接受;拥塞控制是全局,防止过多数据注入网络导致网络拥塞。

12. 滑动窗口知道吧,讲讲滑动窗口?拥塞控制的四个算法知道吧,讲讲四个算法? (说到后面自己有点口胡哈哈哈哈,面试官说没关系他知道我知道了。

13. 输入url回车经历了哪些过程? 简单记录一下,浏览器解析域名=》dns服务器找ip地址(递归or迭代)=》传输层tcp三次握手建立请求=》发送http报文=》接收报文给浏览器渲染

14. 知道浏览器怎么渲染的吗? 不知道呀

15. 计网过了,问问os吧,知道堆栈嘛? 我说我可以从Java的角度来讲吗,就说了堆线程共享,栈线程私有(这和Java角度有什么关系啊喂)。然后问我进程之间共享嘛?我说不共享来着。

16.知道虚拟内存和常驻内存嘛? 我说我知道虚拟内存,就举了个例子来说明虚拟内存,提了下调页和缺页中断。

17. 调页算法有哪些呢? lru,lfu,fifo,理想化的opt。

18. os过了,我看你经历挺丰富的,没参加过算法竞赛吗? 无,我今年才开始学的算法。面试官说数据结构与算法不是应该大二就学了嘛?我说我们大二只学了数据结构,算法是后面的选修课

19. 那你知道常用的算法吗? 然后挨个问我知道链表吗,知道双向链表吗,知道树吗(我内心os:这不是数据结构嘛 然后问我知道完全二叉树吗,我说知道,但是一下子不知道怎么描述,语废啊我,然后他就在共享屏幕给我手打让我判断了

然后问我知道图吗?我说简单用过,果不其然他就带着【dijkstra】来了,实话实说真的忘了

然后问我知道大顶堆吗?我说知道,他就给我打了一个大顶堆的图,问我弹出最大值后会怎么做,毕竟是手写过大顶堆的人,我凭着记忆说把最小值和最大值互换,最大值取null,堆顶的最小值下沉。然后他问我如果不是完全二叉树怎么办,没理解,重新画了个情况,就是把同层的两个节点互换了下位置,我说我记得他下沉的时候会跟同层的兄弟节点做判断,具体忘了(就这你也敢说自己手写过大顶堆?

20. 那我们来写道题吧? 说出来你可能不信,是力扣第一题

力扣1.两数之和
https://leetcode-cn.com/problems/two-sum/ 不过面试官只要求我返回存在情况的个数。

其实一开始没想法的,说了可以通过set存储然后遍历,然后他说可以不用额外空间嘛,想了会儿我说可以预排序然后用双指针。他说对,然后写了核心代码。

提升,如果是三数之和呢?也有原题 力扣

15.三数之和
https://leetcode-cn.com/problems/3sum/ 不过面试官的题是无重复数组

我说加个循环,最外层指针做for循环遍历,每层还是双指针,问了时间复杂度,我说nlogn。

提升,如果有重复数组呢?

我纸上画了下说让两个指针移动的时候跳过重复的就好了,最后大概是时间还充裕就让我把这版代码也写了。

中间有点空指针的bug,也改出来了

提升,如果是k数之和呢?不用写,直接说思路就好,

没啥思路,面试官就提示我了,问我说一个数组的全排列会做吗,我就说了回溯,然后就说噢这题就可以回溯,回溯的时候判断就好。还好没让写,毕竟我写回溯很容易出错。

21. 反问 其实我也没什么想问的,就像征信的问问常见问题。

Q:部门用的python和go吧,如果通过的话需要学些什么框架呢?

A:列举了诸多框架,还讲了字节自己的一个框架,说如果想学的话可以去找开源的gin。

Q:有什么个人建议吗?

A(笑着说):我只是个面试的,不好给你提建议啊。

Q:那有什么学习方法推荐吗?

A:这个每个人的学习方法都是不同的,有的人喜欢看书,有的人喜欢看博客。

Q:好了没问题了,辛苦您了!


基本上的问题都重现出来了,深度回忆快榨干我了

总体来说真的偏基础,跟我网易二面简直是一个天堂一个地狱。。。

自我复盘的话:符号引用和直接引用,类加载的打破,代理,mysql的日志,图。这几部分说的不咋好,要回去重温啦。

可能是真的很缺人吧,看一面面试官说的【做都做不完的需求】就能看出来了哈哈哈 最后我不行了我好困我去睡大觉了,加油吧。

最后给大家分享些我一直在刷的面试题还有思维导图,个人感觉还不错首先要有一个完整知识架构思维图

然后根据思维导图来学习和准备面试

因为涉及的知识面太广了,不能把所有的学习笔记和面试题目全部展示出来。笔者这里已经都整理好了,有想获取到学习参考的朋友可以点击此处来获取就可以了!

Java基础笔记总结

  • Java开发环境配置
  • Java基本语法
  • Java执行控制流程
  • 面向对象
  • 访问控制权限
  • 接口和抽象类
  • 异常
  • 内部类
  • 集合
  • 泛形
  • 反射
  • 枚举
  • I/O
  • 注解
  • 关于null的几种处理方式

基础面试题目及答案

性能调优笔记总结

性能调优面试题目及答案

微服务笔记总结

微服务面试题目及答案

分布式笔记总结

架构知识笔记总结

Redis核心原理和应用实践

Netty实战

Nginx实战

关于架构方面的实战文档和面试题目及答案,这里就不一一例举了。可以点击此处来获取就可以了!

希望大家都能收割到心仪offer

相关文章
|
1月前
|
NoSQL 中间件 Java
字节面试:聊聊 CAP 定理?哪些中间件是AP? 哪些是CP? 说说 为什么?
45岁老架构师尼恩在其读者交流群中分享了关于CAP定理的重要面试题及其解析,包括CAP定理的基本概念、CAP三要素之间的关系,以及如何在分布式系统设计中权衡一致性和可用性。文章还详细分析了几种常见中间件(如Redis Cluster、Zookeeper、MongoDB、Cassandra、Eureka、Nacos)的CAP特性,并提供了高端面试技巧,帮助读者在面试中脱颖而出。尼恩还推荐了其团队编写的《尼恩Java面试宝典PDF》等资料,助力求职者准备面试,提升技术水平。
|
2月前
|
Arthas Kubernetes Java
字节面试:CPU被打满了,CPU100%,如何处理?
尼恩,一位拥有20多年经验的老架构师,针对近期读者在一线互联网企业面试中遇到的CPU 100%和红包架构等问题,进行了系统化梳理。文章详细解析了CPU 100%的三大类型问题(业务类、并发类、内存类)及其九种常见场景,提供了使用jstack和arthas两大工具定位问题的具体步骤,并分享了解决死锁问题的实战案例。尼恩还强调了面试时应先考虑回滚版本,再使用工具定位问题的重要性。此外,尼恩提供了丰富的技术资料,如《尼恩Java面试宝典》等,帮助读者提升技术水平,轻松应对面试挑战。
字节面试:CPU被打满了,CPU100%,如何处理?
|
2月前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩分享分库分表的基因算法设计,涵盖分片键选择、水平拆分策略及基因法优化查询效率等内容,助力面试者应对大厂技术面试,提高架构设计能力。
美团面试:百亿级分片,如何设计基因算法?
|
2月前
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
37 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
1月前
|
缓存 前端开发 JavaScript
"面试通关秘籍:深度解析浏览器面试必考问题,从重绘回流到事件委托,让你一举拿下前端 Offer!"
【10月更文挑战第23天】在前端开发面试中,浏览器相关知识是必考内容。本文总结了四个常见问题:浏览器渲染机制、重绘与回流、性能优化及事件委托。通过具体示例和对比分析,帮助求职者更好地理解和准备面试。掌握这些知识点,有助于提升面试表现和实际工作能力。
66 1
|
2月前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
3月前
|
Web App开发 前端开发 Linux
「offer来了」浅谈前端面试中开发环境常考知识点
该文章归纳了前端开发环境中常见的面试知识点,特别是围绕Git的使用进行了详细介绍,包括Git的基本概念、常用命令以及在团队协作中的最佳实践,同时还涉及了Chrome调试工具和Linux命令行的基础操作。
「offer来了」浅谈前端面试中开发环境常考知识点
|
2月前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩在读者群中分享了关于分库分表的基因算法设计,旨在帮助大家应对一线互联网企业的面试题。文章详细介绍了分库分表的背景、分片键的设计目标和建议,以及基因法的具体应用和优缺点。通过系统化的梳理,帮助读者提升架构、设计和开发水平,顺利通过面试。
美团面试:百亿级分片,如何设计基因算法?
|
2月前
|
Java API 对象存储
JVM进阶调优系列(2)字节面试:JVM内存区域怎么划分,分别有什么用?
本文详细解析了JVM类加载过程的关键步骤,包括加载验证、准备、解析和初始化等阶段,并介绍了元数据区、程序计数器、虚拟机栈、堆内存及本地方法栈的作用。通过本文,读者可以深入了解JVM的工作原理,理解类加载器的类型及其机制,并掌握类加载过程中各阶段的具体操作。
|
2月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
93 2

热门文章

最新文章