字节商业化后端实习1+2+3面
3.28字节跳动一面+二面
一面:
自我介绍;
围绕项目问问题,会先从应用的点逐步切入,深挖。问的还是挺细的。
- 项目是自己完成的吗,架构设计是什么样子的?我从数据库表设计说起,分为三层架构逐层设计。面试官追问你数据库层面有做什么优化没?我说我的表比较少,就正常设计了。应该说一下索引的。
- 怎么保证Redis的高可用,redis崩了你数据怎么办?
- 怎么解决的超卖问题?
- 如果有大量非法用户发送请求,你怎么保证数据库不崩?
- 索引失效的场景?
- 怎么保证数据在消息队列不会丢失?我说给每个数据加一个UUID,在发送方和接收方进行比对;面试官好像不是很满意,他说那你需要建立两个表吗,如何进行比对。我说这块我没有在项目实现,在帖子上看到的方案;
- 你为啥用RabbitMQ?我说RabbitMQ并发量比kafka低,但是够用我的场景了,而且是开源的。面试官说其他的消息队列也是啊。确实,这块还是得仔细想想,技术选型挺重要的,大家也要注意。
- 你怎么处理大量用户请求?
- 怎么阻塞线程?我答使用sleep()/park()等方法,面试官继续追问你见过在java源码里使用这些方法吗。。我答在JUC包下ConcurrentHashMap有用到。(就对这个熟悉,别的没敢说)
- java线程池的参数,拒绝策略有哪些
算法题
写一个sql查询:给定一个表table,包含以下字段:
id name start_time end_time
给定一个时间区间[1,10],查询所有在这个区间的数据;
lz好久没写sql了,硬着头皮这样写:
select * from table where start_time>=1 & start_time<=10
之后面试官说求的是在这个区间的数据就要算进去,我一想,[5,15]这样的也算,又改了一次:
select * from table where start_time>=1 || start_time<=10
面试官说那[20,30]的算不算?我一看又错了。。。菜的真实的xdm。之后又写了一会面试官没耐心了,说这题先到这吧,你说说思路也行。哎,心里凉半截了,我说应该从区间位置关系去判断,数据在给定区间的左侧且有重合,在给定区间的右侧且有重合,包含给定区间,被给定区间包含。。。我都觉得太罗嗦了这样,面试官说你多久没写sql了哈哈哈。
之后做一道java编程题。二叉树中和为某一值的路径 .之前做过,但是我没看清题,是到叶子节点的路径,我以为是任意一个路径就可以。。。哎,瞬间觉得没戏了。对了,字节的编程平台也是ACM模式,但是用着很不习惯。。
之后面试官说差不多了,让我问下问题。我说我这次面试有哪些不足的地方?面试官说你的工程应用能力还得再提高。我追问工程应用是指项目?他说是SQL和编程。之后问了面试官的部门业务。
到此为止我以为已经无了,谁让咱没A了算法题呢,面试官说你先别退会议,一会二面。我一脸蒙的说好。
二面:
二面是个很温柔的姐姐,很有耐心。
- 自我介绍
- 用户登录功能设计
- 怎么保证Redis可用性,持久化策略,内存满了怎么办(这里给提醒了内存逐出策略)
- rdb和aof区别
- 一次HTTP请求的处理流程,详细说说
- 平时遇到过并发问题吗,怎么解决?我答:加锁(Synchronized)不加锁(CAS)
- 接上条,锁升级了解吗,具体说说
- 你的每次用户登录校验都需要从数据库读数据,考虑性能问题了吗?这个没考虑到
- RabbitMQ是怎么完成数据的存放的?我把数据发送过程说了下,面试官说她想问的是RabbitMQ是怎么保存数据的,是用Broker还是?我??表示不了解,只会基本使用。
- 消息队列的数据怎么保证不重复不丢失,分布式系统怎么保证数据不会重复
- 注册中心是怎么实现的,原理?这个也不会,就简单用了下。
- DNS负载均衡是怎么实现的?我答了哈希负载均衡,说这个可以详细讲讲吗?面试官说当然可以。说了哈希负载均衡的数据结构设计,如何实现的负载均衡。其实还可以讲讲负载增加的Rehash操作,面试官没再继续问我就没说了。
- Redis集群的设计是用的哨兵吗?说说当master挂了哨兵是怎么处理的
- Redis的底层结构:string底层是怎么实现的
- 看你写了Netty,你应该懂网络编程哈。我赶紧说还在学,没学完(手贱写简历上了)。面试官说那简单问问,说说RPC的调用。
- JVM调优你是怎么操作的,我说用一些可视化软件进行操作,排查死锁,OOM,内存泄漏等。
- 说一下dubbo这种RPC的组成部分。
- 你平时是怎么平衡自学编程和学业的。我说有空就学,哈哈哈
算法题:
给你一个整数数组,将数组分成m份,每份的数组和相等,问m最大值。
举例:nums={1,2,2,3,4,6}可分成{1,2,3},{2,4},{6},所以m==3
我看了一会说没思路,面试官姐姐给了提醒:可以把数组加和之后从数组长度n开始判断,能分成n份吗。我当时没太理解,写了一会时间到了,让说了说思路。我的思路是对于数组从n份开始判断,能分成n份吗能分成n-1份吗。。。我建立了一个Map。存放数据出现的次数,想在这个基础上判断。。面试完搜了答案才发现并不需要知道要分成的元素具体是啥,只需要先把数组倒排序,从数组最后一个位置开始判断,如果最后一个位置不行,那就去找和为nums[0]+nums[n-1],因为这是能构成相等子数组的最小值。依次循环判断。
之后反问面试表现。面试官说你基础还是不错的,算法题再提高一下。
又问了下部门和业务。
总之一句话,女人会可能离开你,兄弟可能背叛你,但算法题不会,算法题不会就是不会。(/doge)
OK,就这样了,以后多刷题多总结,不要总觉得能做到原题。。虽然原题也不一定能做出来。。。加油奥里给。
3.30字节跳动三面
55min
先做自我介绍
为什么要学编程,你理想的工作环境是什么样的,你是想转正的吗
问了课题组的项目流程,为什么进行进行代码重构,如何保证重构前后的业务代码一致性;你参与了哪些工作;
问了秒杀的业务流程,如何保证不出现超卖。你用Redis比较多,那Redis出现问题你的数据怎么办?你说到持久化,那么rdb文件是怎么在Redis里存储的,是否每次更新数据都要保存快照,底层是怎么实现的。
智力题:从九个人中等概率选出两个人,你只有一个六面的骰子,骰子上的数字分别是1-6.
其实就是rand(1,6)到rand(1,9)的映射。我的策略是九人分三组,开始扔三次骰子,从三组分别找出一个人,之后再让这三个人PK,找出第一个被选中的人。选第二个人是8人分两组,以此类推。
问了朋友,他的方法是从9人选两人的方案数是C29,也就是36种,那么只需要将36均分成6个区间,第一次选出一个区间,第二次选出区间的一个组合。这种方案确实很不错。
下面是算法题。第一次抽的是给一个二维char数组,找出一个单词是不是在该数组里。经典回溯题,但是面试官突然说这个题有问题,又重新抽了一道。第二道是找出两个字符串的最长公共连续子串,也是经典dp问题,先定义dp[i] [j],再推状态转移方程,一会也写完了。测试用例过了。
最后反问了当前的技术栈是哪些,被告知是java语言相关,不用转语言。问了如何学习分布式。
这周 三天面了四场,小小总结一下吧。
面试官的目的不是为了把你问住,而是看你对技术栈掌握的广度和深度有多少,尤其是在现场面试的环节,你的临场表达是否清晰,逻辑自洽等。不了解的地方告知面试官,及时止损。
算法题可以不用最优解,用你觉得最稳的方案先做出来,之后有优化的方案可以再和面试官讨论。
算法题思路不确定要先和面试官沟通,讨论一下思路,如果面试官不同意那就算了。在自己没太大把握做出来的时候一定不要闷头写。
总的来说,java基础,jvm,多线程,数据库语句和底层结构,操作系统,计网都有涉及,而且往往从项目入手,对用到的技术栈深问,看你的深度,技术选型和对意外情况的考虑等。
#面试复盘##实习#