字节后端日常实习一二三轮面经(已OC)
12.30 晚上投的简历,31号 Hr 就打电话约时间了,因为元旦一面约在 4 号下午。5号上午约了当天晚上二面。中间几天自己要考试,三面约在 10 号。第二天 Hr 面,已 OC.
一面(80min)
个人情况,实习时长为什么要实习?为什么不保研去就业?
项目介绍
为什么用这个框架?知道 JPA 吗?为什么不用 JPA?区别?你用的这个项目有什么特点?底层的区别?
算法
-
略有一点变化。十分钟秒了。
被吐槽了变量的命名(我直接用的abcd...)
问了股票2,秒给思路。因为答题太快被发现刷过题了,没让写= =
给一个歌单,如何随机播放?不用实现(答的不好,绕了很久,还扯到哈希冲突之类乱七八糟的)
基础题
OOP 课程是用的什么语言?三大特性?解释下多态?GO 语言中的多态了解过吗(没了解)知道 Java 和 Go 的区别吗?(不知道)
Java 单例怎么实现?为什么用 DCL?
点击链接到显示页面中发生了什么?
因为最后多嘴说了下"数据传回来后浏览器再进行渲染",被追问 HTML/CSS 渲染时的区别?
我???我面的不是后端吗??
浏览器缓存?
项目对对应到服务器的什么服务?(没懂他想问什么)
IPv6?为什么 v4 不够?怎么缓解不够(子网,NAT)?还知道4和6哪些区别?
知道物联网吗?
我???我面的不是后端吗??
强答了一发智能家居智慧农业云计算边缘计算,然后面试官说"哦没事我只是好奇现在学校都在教什么"
= =满脸黑线
了解线程池吗?联系项目问了问?(淦基本不会)
如果你这个项目用到两个服务器?怎么通信?(卡了一会,答得不好)
MySql 隔离级别
可重复读是什么?幻影读?
项目里是怎么写事务的(就正常一条语句一事务,没优化)
什么时候注解不生效?(没了解)
MySql 是怎么存储数据的?(答了 InnoDB 和 MyISAM 的)
为什么是 B+ 树?
所有数据都在叶子节点吗?
select from user where a=1 order by update time desc limit 10 0
怎么建索引?(
(a,time)
和(time)
)为什么?如果a
只取 0 和 1 还是这么建吗?(只砍一半的话没必要索引,而且用日期是自然升序的更好)
反问
- 业务?
- 面试评价(基础扎实,练过力扣)
- 后续面试
总结:第一次面试真的紧张爆炸,但还好开始之后就冷静下来了。感觉面试的云里雾里一会前端渲染一会物联网,把我问的一愣一愣的。体验不太好,但是似乎面试官体验很好:cry:
二面(65min)
一面的算法问的比较简单,甚至因为写的太快被看出来刷过题,估计面试官之间沟通过,这一轮算法问的比较细,回答的不太好的。
项目
- 介绍了一下项目,稍微问了下应用背景,没仔细问。后面都是基于我写项目中应用的技术点展开问的
- Cookie 了解多少?应用场景?安全、关于 Cookie 的攻击?
- 加密的方法了解过哪些?讲一下 HTTPS?混合加密的具体协商流程,优势?
- Docker 是怎样实现隔离的(没答出来)
基础题
OS:进程的切换时机
OS:切换时需要保存哪些数据?
OS:如果是单核 CPU,多进程/线程还有优化吗?为什么?(答错了)
OS:逻辑地址与物理地址的转换?为什么?
服务器:Linux 下逻辑空间是能够全部使用吗(不知道)?
算法题
排序算法
- 知道哪些
- 快排的最坏复杂度?优化办法(答的不好)?平均呢?为什么是 nlogn(没答出来,刚结束面试两分钟就立马想出来了,恨)? 如果每次选位置在 1:9 的数字,会怎么样(没答出来,结束后才意识到其实是对面的提示)?
动态规划
一个给定长度为n的数列,每次可以从中挑出一个数并删除,假设选的数为X,那么数列中等于x+1和x-1也要被删除,同时获得的分数为x,操作次数不限,那么能得到的最大分数是多少?
举例:[3,3,4,4,5,5,2]
- 第一轮选择 4,得分为 4,数组剩余 [4 ,2](删除所有的值相邻的,但是本身只删一个)
- 第二轮、第三轮选择 4 和 2,最终得分为 4+4+2=10
- 这种选法不是最优解,答案应该是 3+3+5+5=16
面试官人很好,先让我想思路想了七八分钟。我基本想出来是用动规解,问了下数据范围(没有负数,数据都在 int32 之内)讲了下大概思路。对方表示认可。然后花四五分钟仔细想了想,写了转移方程,被要求解释。之后十分钟写代码,自己测的几个样例都没问题。
对方表示存在代码存在问题,试图举反例但是失败了= = 结束后仔细想了下代码应该是没有问题的,感觉是对面在寻求常数级优化的时候把自己绕进去了=。=
其实本质是打家劫舍,在此之前 dp 我只做过斐波那契和爬楼梯= =
public static int foo(int[] nums){ Arrays.sort(nums); int max = nums[nums.length-1]; int[] values = new int[max+1]; for(int i = 0; i < nums.length; i++){ values[nums[i]] += nums[i]; } // System.out.println(Arrays.toString(values)); int dp0 = 0; int dp1 = values[1]; for(int i = 2; i < values.length; i++){ int tmp = Math.max(dp1, dp0+values[i]); dp0 = dp1; dp1 = tmp; // System.out.println("Curr = "+i+",dp0="+dp0+",dp1="+dp1); } return dp1; }
反问
业务?(三面会给你介绍)
面试评价?(再讨论讨论)
后续面试安排?(等 HR 电话)
三面(60min)
项目
自我介绍+项目介绍
问了下项目的实现,系统的设计。
技术选型,问为什么用这个框架
先介绍了下框架,被打断,问为什么用这个
说了说框架优点,被打断,问有没有用过其他的
硬着头皮扯出了大作业用的框架,被打断
面试官:"其实是只知道这个框架对吧?"
我:"对。"
场面一度十分欢乐:joy:
系统设计
如果要给你的项目加一个签到系统,累计签到 30 天发放奖励,你会怎么实现?
最基本的想法是采用位图的形式,登录为 1,没登录为 0。但是在存储上比较麻烦,查询起来需要遍历30次
使用链表,登录的天数挂个新结点,没登录的不挂结点。
被追问:链表太长了怎么办?
内心 OS:你反正是个链表长就长呗爱多长多长
答:每个月的链表单独分开维护,为了能继续保证连续天数的功能可以在每个链表头加一个属性标识此前已经连续签到了多少天
被追问:所以你这个设计怎么检测 30 天?依次回溯直到发现不连续吗?
答:不用,直接前寻 30 个结点,比较结点的日期和当前日期相差天数是不是 30 即可。
感觉系统设计题不需要太过考虑实现,比如我这个方案其实实现起来很麻烦,但是设计嘛,不拘小节:dog:
智力题
64马,每赛道8匹,最快几轮决出前四?
不难,在面试官的帮助下拿出了最优解,思路可以看这里
算法
反问
- 介绍下部门?业务是什么?
- 我进去之后会干什么业务?
- 技术栈?
- 成长体系,mentor
- 问了点无关的(指核酸检测)
- 面试表现(当场通过)
Tips:建议反问的时候先从业务问起,表示下对工作的热情(?);再问技术栈,表示对技术的追求(?);接着问成长体系,表示对未来的憧憬(?);最后再问面试表现。
谁让你上来就直球面试表现啊(恼
HR面(15min)
- 自我介绍
- 项目介绍
- 项目难点
- 学习途径
- 学校安排
- 毕业安排
后面都是随便聊天
#后端实习面经##实习##面经##字节跳动#字节的面试体验还是不错的,效率高,面试前后都有邮件引导。
面试是在单独的网页面试间,有代码提示和高亮,自己写测试函数和测试用例。
还有啥在评论区问