推荐搭配 面试相关知识 食用。
本来是准备留在创业公司的,结果疫情严重、经济下行,正好公司的业务是上海的线下娱乐(剧本杀)行业,短时间内不少投资人都撤资了,长时间的话也需要很长一段时间才能复苏。综合考虑,还是选择离职,回到大厂来。
由于校招有毕业时间限制,这个情况是没法走校招了。走三年以下经验岗位的社招也还行,就是 hc 没有校招那么集中就是了。
# 博乐科技
# 笔试
- 给出计算个税的公式,计算个税。模拟即可。
- 84. 柱状图中最大的矩形 - 力扣(LeetCode) (opens new window)。其实就是一个贪心题。
- 给定一个数组,要求从数组中选择一个子序列,满足子序列是锯齿数组 (opens new window),且子序列里相邻元素的差的绝对值之和 最大。其实也是一个贪心题。
- 以数组形式给出两个关于 的多项式的每一项的系数 和次数 ,要求以相同的形式返回多项式的和的每一项的系数 和次数 ,且不能调用系统的排序算法。其实就是要手写一个排序算法。
# 一面
一面 23 分钟,问的很基础,这就是小公司吗 23333
- 自我介绍
- 聊一下项目和实习经历
- 对游戏服务器有了解吗?有什么特点?
- 平时用过哪些数据库?
- 对 Redis 有了解吗?(说用得不多,就没有深问了)
- MySQL 索引的作用和副作用?(加速查、增;增的时候需要多写一个表)
- 数据库写入数据的过程(redolog、binlog 相关,不会)
- TCP 三次握手与四次挥手的过程
- 八皇后问题 (opens new window)
- 反问
# 二面
二面 33 分钟,主要就是算法题
- 自我介绍
- 平时有写博客吗?
- 平时有学习笔记吗?(和博客放一起的)
- 博客和学习笔记是上传到云端吗?
- 手写冒泡排序(包含对冒泡排序的优化,即每轮冒泡过程中只需要循环到上轮冒泡过程中最后调整顺序的位置即可)
- 反问
面试官很和善,教冒泡和优化也教的很好(太久没写冒泡突然不会写了23333
# 三面
三面 1 个小时,大部分时间都是在写代码上,最近没写代码,真是太生疏了。
- 问实习经历和项目
- 找数组中的第二小的值
- 给定一个字符串,求字典序最大的子序列(搞了半天最后发现是单调栈)
# HR 面
HR 面一个小时,微信电话,就是单纯的聊人生规划、聊大小厂选择、聊实习和项目中经历、如何学习、学到了什么等等。
# 快手
# 春招一面
- 自我介绍
- 聊两段实习的经历
- 选个项目聊一下
- 项目里有什么难点(跨域)
- (项目里提到 REST API)REST API 怎么使用的
- GET 和 POST 有什么优缺点(GET 不能有
request body
;GET 操作幂等,适合缓存) - 一个 HTTP 报文有哪些字段
- 幂等是什么
- “让金额增加十块”这个 API 应该怎么设计(使用不幂等的 POST 或 PATCH)
- 这个 API 的事务是 JVM 的事务还是数据库的事务(Spring Boot 的
@Transaction
是数据库的事务) - 事务会不会产生有锁
- MySQL 有几种锁(共享锁、独占锁;表级的话还有共享意向锁和独占意向锁)
- 两个人同时更新,会不会有问题(如果在数据库里加则没有问题,即
UPDATE table SET money = money + 10
;如果在后端里加的话需要在数据库SELECT FOR UPDATE
加锁) - 索引是什么
- 聚簇索引和非聚簇索引是什么,有什么优缺点
- MySQL 把主键作为聚簇索引有什么好处(插入快)
- 如果业务主键不是递增,怎么回避这个问题
- B+ 树,还有哪些数据结构,B+ 树的优点(层数少,I/O 次数少)
- 选一个计网知识点介绍一下(选的 tcp / udp)
- 你的项目会迁移到 udp 吗?(如果有优点有缺点的话,需要权衡优缺点)
- udp 业务场景有用吗?(在线会议等允许丢失的视频流)
- udp 分包有什么用?(某一部分 ip 包丢失,导致整个 udp 包都会被丢掉。如果 udp 包太大,传输损失会很大)
- tcp 的窗口是什么?
- tcp 拥塞控制是什么?
- 层序遍历 (opens new window)(写完代码编译不过,面试官一起看也没发现问题,最后对着代码说了一下思路)
- 层序遍历复杂度是多少?两层循环看起来像是
O(n^2)
,为什么是O(n)
- 反问
部门是快手核心部门。面试官的功底相当深厚,没有拿着八股文问,而是针对我的业务场景问数据库。人也很好(让我选哪些八股来问,我也得以跳过了 JVM 部分)。工作时间 10-10-5,核心部门的话也可以理解。
# 春招二面
- 由于二面面试官看过一面的录像,就跳过自我介绍了,直接介绍项目
- 聊实习
- 第二段实习里面学到了什么?(学到了技术选型)
- REST API 相较于其他前后端交互方式有什么好处(API 可读性高,只需要语言支持 HTTP Client,相较于 gRPC API 需要生成客户端代码更加方便)
- REST API 和 gRPC 本质上有什么区别(感觉本质上其实都是差不多,客户端调用函数,服务端把调用接到某个函数上,业务逻辑运行完成后返回一个值)
- Spring IoC 原理和具体的过程,解决了什么问题(循环依赖)
- AOP 是做什么的
- Redis 有用到吗?(没有,toB 的业务不太需要缓存)
- (面试官可能看我啥八股都不会,开始聊对计算机的理解)广泛意义的缓存有什么用?(缓存用于加速一个慢的介质的读写)
- 什么时候会加缓存?(性价比高的时候会加缓存)
- 如果磁盘的速度达到了缓存的速度,那还需要缓存吗?(缓存的速度也会提高,存储器的金字塔模型 (opens new window)是会一直存在的)
- 寄存器的速度怎么提高(这个太偏硬件了,不知道,面试官说时钟周期变短了,寄存器速度就提高了)
- 操作系统的内存管理(分页,记录页表,还利用 TLB 进行加速)
- TLB 是怎么加速的(TLB 在 CPU 里,而且可以并行比较)
- 手写链表的快排
- 夸我的博客主题好看(有点开心)
- 看我博客写的东西都比较广,问平时在学哪方面的东西
二面面试官也是很强,人也很好,看我 Java、Spring、AOP、Redis 的八股文都不太会,也不为难我,直接开始和我聊广泛意义的缓存,聊到如何加速寄存器、操作系统的页表和 TLB,总之就是在聊和开发不太相关的计算机的专业知识,以及谈对计算机的理解。
# 秋招一面
- 面试官自我介绍,是基础存储层的
- 自我介绍
- 聊项目
- 聊实习
- 详细聊实习中用到的 FaaS,如何设计 FaaS 使得减少冷启动时间?(预加载)为了应对并发请求,如何控制预加载的数量?
- Spring Boot 和 Spring Framework 的关系?
- Spring Boot 是如何启动的?如何调用其它 starter 包的?
- Spring Boot AOP 是怎么用的?(日志)为什么不使用 Spring Interceptor?(因为没听说过 Interceptor 啊)
- 操作系统的进程调度是什么?有哪些进程调度算法,以及优缺点?
- 手撕前缀树 (opens new window)
面试官人很好,和我聊职业规划(为什么想做全栈,全栈可以去哪些公司),还想帮我转推荐到其他部门。不过确实是岗位不太匹配,所以也没有进一步沟通了。
# TP-LINK(社招)
# 一面
- 自我介绍
- 问实习经历和项目
- 项目里有用到分布式吗?没有分布式的话,如何改造成分布式保证高可用?
- 选项目里的一个后端接口,聊聊如何实现的(选的是下单、支付这一块的)
- 平时用哪些语言开发
- Spring IoC 原理(我不知道,面试官提示我用到了反射,于是说了一下我的理解)
- 动态代理类是什么
- B+ 树和 B 树的区别?
- 为什么 B 树和 B+ 树叶子结点大小一样(因为磁盘按页存储、访问)
- 平时还有哪些方面了解的比较多(不过也没深入问)
- 反问(工作时长 8:30-18:00)
一面半个小时,可能因为是社招,没有问算法题这一块。面试官人挺不错的,引导我回答 Spring IoC 原理。不过估计是挂了,毕竟社招门槛也高一些。
# 二面
二面也是半个小时,主要是问实习和项目。问的很细。八股文是一点没问。
原来 SSM 快过时了,现在分布式才是主流。
# 微软
# 笔试
微软的笔试一直都挺硬核的,130 分钟 3 道题,我做了快两个小时。
- 给定总金额 和一个只包含
x
和.
的字符串表示一条路,其中每个x
表示路上有一个坑。除掉连续的 个坑需要花费 块钱,求能除掉最多的坑数。字符串的长度和 都在1000000
以内。贪心算法,优先除掉长的连续的坑即可。 - 给定一个只包含
W
和R
的字符串,可以通过一次操作交换两个相邻字符的位置,求将所有R
交换到一起需要的最少操作数。也是贪心,需要找到数量上最中间的R
(使得该R
左右两边的R
数量的差为 0 或 1),然后让所有R
靠近这个R
。 - 有 个门诊室和 个患者,每个患者只会去其指定编号的两个门诊室中的一个。需要判断是否存在方案满足所有患者需求,同时使得每个门诊只有一个患者,只需返回
true
或false
。是个图论题(门诊室是点,患者是边),判断是否存在环。可以用 BFS 做,每次去掉度为 1 的边。
# 大疆
# 笔试
- 输入多个以
HH:MM
字符串格式表示的时间,要求输出这些时间的两两之差的最小值(单位为分钟)。水题。 - 给定一个长度小于 5e4 的数组,可以进行无限次操作:将一个偶数除以 2,或将一个奇数乘以 2。计数组任意两数的最大差值为 n;求变换后最小的 n 值。
第二题有点难,直接贪心(如果数组最大值是偶数就除以2,如果数组最小值是奇数乘以2)会有问题:对于 8 7 3
这组数据,如果一来就把数组最大值除以 2 得到 4 7 3
,最终结果是 4 7 6
答案为 3,但最优解是 8 7 6
答案为 2。
这个做法的问题在于,对偶数的除法是不可逆的,所以直接贪心可能会翻车。(然而这种做法能通过所有样例数据,也是醉了
晚上突然想到了一个解法:既然奇数乘2可逆,而偶数除以2不可逆,可以转化一下题目:先把所有奇数全部乘2,然后只提供将偶数除以2这一种操作。这种情况下就不需要考虑最小的数会变大的情况,直接贪心:每轮把最大的数除以2并统计当前结果,一直重复到最大的数是奇数为止。所有结果中的最小值就是答案。
# 网易雷火
# 第一志愿笔试
- 有 n 个需要钥匙才能打开的箱子,给定一个二维数组(离谱的是用 JSON 字符串形式给出的,我直接用 Python 调库了)
boxes
,其中boxes[i]
表示箱子 i 内装了哪些箱子的钥匙。求初始只有 0 号箱子的钥匙,能否打开所有箱子。拓扑排序,会做这道 (opens new window)就没问题 - 给定 n(n < 1e9),求 0~n 中有多少个数组包含
25
。统计的时候不会去重,最后暴力过了 80%。ACM 室友说是数位 DP (opens new window),还真是。例题在HDOJ (opens new window) - 希尔伯特-皮亚诺曲线中,给定规模 n(n <= 30,下图中的规模从小到大为 1-6)和两点的坐标
(x1, y1)
(x2, y2)
,求两点间的曲线的长度。可以每次将分形分为四个部分,讨论点在左上、左下、右上、右下的情况,块间的距离很好求(2^n),块内的距离可以用递归求解(需要变换大分形的坐标到小分形的坐标)。
2 题的代码:
class Solution {
List<Integer> number;
int[][][] dp;
/**
* 记忆化搜索,计算确定 position 的高位后,不包含 25 的数的个数
*
* @param position 当前不确定的数位(0 为个位)
* @param preNum 前一数位的值
* @param isLead0 前一数位是否为前导 0
* @param hasLimit 当前数位的取值是否被 n 限制(如果限制,则后面只能取到 n;如果不限制,后面可以取到 999)
* @return 个数
*/
int dfs(int position, int preNum, boolean isLead0, boolean hasLimit) {
if (position == -1) {
return 1;
}
if (!hasLimit && dp[position][preNum][isLead0 ? 0 : 1] != -1) {
return dp[position][preNum][isLead0 ? 0 : 1];
}
int answer = 0;
int curUpperBound = hasLimit ? number.get(position) : 9;
for (int curNum = 0; curNum <= curUpperBound; curNum++) {
if (preNum == 2 && curNum == 5) {
continue;
}
answer += dfs(
position - 1,
curNum,
isLead0 && curNum == 0,
hasLimit && curNum == curUpperBound
);
}
if (!hasLimit) {
dp[position][preNum][isLead0 ? 0 : 1] = answer;
}
return answer;
}
public int solution(int n) {
number = new ArrayList<>();
int _n = n;
while (_n != 0) {
number.add(_n % 10);
_n /= 10;
}
number.add(0);
dp = new int[number.size()][10][2];
for (int i = 0; i < number.size(); i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 2; k++) {
dp[i][j][k] = -1;
}
}
}
return n + 1 - dfs(number.size() - 1, 0, true, true);
}
}
# 第一志愿一面
- 自我介绍
- 聊实习,实习中的难点
- 从实习说到了数据库事务,数据库事务的隔离级别和实现?
- 重新聊聊笔试里的设计排队系统
- 如何实现可查询当前排名的排队系统(普通的数组查询慢,记录所有人当前排名的话更新慢,综合一下的话就是对排队进行分区,记录所有人当前所在队伍分区,这种实现的查询和更新的复杂度都是 )
- Redis 有哪些数据结构,在 Redis 中实现排队系统会用什么数据结构?
- 中断是什么,软硬中断的区别是什么?
- DNS 查询的过程
- Python 里面线程和进程的区别?协程有了解吗?
- 你的后端项目是怎么部署的?
- 如果后端响应很慢,在 Linux 服务器上如何进行排查?会用到哪些命令?
- 二叉树中的最大路径和 (opens new window)
- 反问
网易和网易雷火的 965 作息还挺好的,还了解到游戏服务器大多数选用 Python 是因为上手快,另外性能瓶颈一般都可以用更换语言外的其它方法解决,所以也不是无脑 Java、Go 的。
# 第一志愿二面
- 自我介绍
- 项目里有哪些模块
- 项目里的登录是怎么实现的?Session 存在哪里?如果想存在 Redis 里,项目里如何配置?
- Session 和 Cookie 的区别?Cookie 的最大长度?
- cookies、localStorage、sessionStorage 的区别?
- 前端点“登录”按钮到收到响应,发生了什么?(这里问的很细,前端、DNS、后端都有提到)
- 前端请求用的什么工具?
axios
相较 Ajax 有什么优点? - axios 收到 Response 到 axios 返回给 Response 之间,如何进行错误处理(用 axios 的 interceptors)?
- axios interceptors 中有用到
resolve
reject
吗?(项目里用的是同步写法,如果是异步写法的话会用到) - 简单说一下 JavaScript Promise
- Promise 有几种状态,是如何转换的?
- 前端收到登录响应之后会做什么?(返回上一个页面)如何实现返回上一页?用到了 Vue Router 的哪个函数?
- Vue 的生命周期?
- Vue 的
created
和mounted
有什么区别? - Nginx 除了正向代理以外,还有什么功能?(反向代理、静态文件服务器、负载均衡)Nginx 负载均衡有哪些策略?
- Python 协程和线程,优缺点?
- Python 想要充分利用 CPU 该怎么办?用到什么库?
- 职业规划?(前端 or 后端,Java or Python)
- 有考虑来杭州发展吗?
- 没有反问环节,面试官匆匆下播。
问了四十分钟八股文,但是是前后端都在问的,说不定进去以后有机会做全栈。
不过面试官没开摄像头,刚开始面试的时候听声音像是在剪指甲(
# 第一志愿三面
- 自我介绍
- 聊实习,实习里做了什么,学到了什么东西,实习项目如果要处理高并发会怎么做?
- 聊项目,项目如何处理流程(没有用流程引擎,而是用的流程字段),项目如果要处理高并发会怎么做?
- 之前的面试有了解到我觉得 Python 不好维护,想问问我具体是怎么想的(很巧的是,我正好在面试前准备了这个问题,想在反问阶段了解一下大佬对此的看法;我觉得 Python 的动态类型不好维护,大佬说可以通过文档来克服;Python 很适合敏捷开发,所以很多游戏服务器,以及网易里的很多系统会选择 Python)
- 算法题:提取字符串的数字,然后按照整形类型输出。面试系统没有提供测试用例,需要自己尽可能考虑边界情况并进行测试。这里有很多边界情况,比如数字超出 Long 范围(不会 Java 高精度的我直接改用 Python),以及(经面试官提醒)字符串中有
+-
号,以及字符串有多个正负号的情况。 - 智力题,见下图。按照数学的思维,先设置每个格子的值为 。突破口在于 ,而所有数都是非负整数,如果十个数为 1~9,和已经有 45 了;如果有五个数为 1, 也很容易超出 10,所以猜测大部分数应该都是 0。然后一个一个尝试即可得到答案。
- 未来几年的职业规划
- 手里有别的 Offer 吗
- 反问
在反问环节,大佬还问我他之前的回答有没有解答我的疑惑,我仍然不太理解为什么 Python 适合敏捷开发,大佬建议我去 GitHub 找 Python 开源项目,并重构为 Java 或其他语言,在这个过程中就会体会到两种语言的差异和优劣。面试结束后知乎搜了一下,发现 Python 就是单纯的能少写很多代码,更快地把自己的想法实现为代码,然后跑起来,我自己的使用过程中也确实有类似的感觉。一个例子是 Python 没有像 C++、Java 区分什么 int[]
和 List<Integer>
,当然也不用考虑二者的工具函数不同;另一个例子是 Python 3 的数的类型只有 int
和 float
,int
甚至还能支持高精度,就不用考虑 int
、long
的转换等。
所以今天的面试和面试官聊得很开心,也希望有机会进这个组!
# 百度
# 提前批一面
- 自我介绍
- 聊实习,实习中遇到的问题
- JVM 有了解吗(没有)
- Spring IoC 的优点
- IoC 和 AOP 的原理
- IoC 如何解决循环依赖
- MySQL 索引有什么好处
- 索引为什么要使用 B+ 树,HashMap 或者 BitMap 不可以吗?(后者进行范围查询会很慢)
- 哪些字段需要添加索引(查询里
WHERE
、ORDER BY
和JOIN
的字段) - 脏读、不可重复读、幻读有什么问题?怎么解决?
- MQ 有用过吗(没有)
- MQ 用于解决什么业务场景(高并发削峰?)
- Redis 熟悉吗(不熟悉)
- Redis 击穿是什么
- Redis 雪崩是什么
- 分布式熟悉吗(了解概念)
- 分布式里最大的问题是什么(集群内服务器的一致性)
- CAP 三个字母是什么
- CAP 的概念
- 买卖股票的最佳时机 (opens new window)
- 反问
ACG AI 部门,工作时间 10-9-5。不过感觉没有和面试官在一个频道上聊,应该是寄了。
# 正式批笔试
https://www.nowcoder.com/discuss/1049842
# 4399
# 笔试
4399 除了选择题、编程题,还有 HR 面的那种主观题(“你如何分配你的大学课余时间”之类的)。
- 手写归并排序
- 手写 LRUCache (opens new window)
- 给一个网址 (opens new window),写一个爬虫拿到
[排名、球队、积分]
的数据并展示。
# 一面
- 自我介绍
- 几门语言的熟悉程度?之后会选择什么语言进行主要的开发?转语言可以接受吗?
- 作为项目的组长,你负责了什么工作?项目的 Issue 分发是如何做的?Gitee 在实际使用中遇到了什么问题?
- CI/CD 的原理是什么?
- 项目的 CI/CD 是怎么用的?部署的时候用到了什么命令?
- Spring IoC 常用注解有哪些?
- Spring AOP 的切入点有哪些?
- 如果其他团队给我们提供了一个 REST API,我们如何调用这个 API?(使用 Spring 的 RestTemplate)
- 最近有了解 Spring Cloud 吗(“没有,最近在了解 IoC 的原理”,转移话题大法)
- 聊聊你了解的 IoC
- MySQL 是如何使用 B+ 树实现索引的?B+ 树有什么好处?
4399 校招是统招以后再分配岗位,所以面试阶段也不确定实际的开发语言。
25 分钟的面试。面试官还不错,对着简历问擅长的地方,而不是问 Redis、MQ、分布式这些。
# 二面
面试官一下午安排了很多场面试,前面的面试导致我的面试延迟了 17 分钟(15:57),结束的时候是 16:29,正赶上 16:30 的网易三面。
- 自我介绍
- 聊实习,实习中的下单购买如果要支持高并发,该怎么做?(秒杀系统)
- Redis 有哪些基本数据结构?更新数据库以后如何保证 Redis 数据的一致性?
- 数据库平时用的最多的是什么?数据库引擎呢?(MySQL + InnoDB)Inno DB 相较于其它引擎有什么优势?(这里深入聊了一下 MySQL 通过设计不带锁的 MVCC 的原理,使得其相较于 PostgreSQL 的读性能更好)
- binlog 有了解吗?其它的 log 呢?(都没有)
- Linux 系统有用过吗?如何查询端口被哪个进程占用?
- Linux I/O 模型的分类?(不了解)
- Java nio 的接口了解吗(不了解,因为用 Java 主要是在做 Web,对 Spring 了解的更多)
- 如何设计手机 app 扫码登录网页端?
- 没有反问,估计也是怕后面的面试者等急了
# HR 面
前两面都在纯问八股,我还以为有个主管或者大佬来面第三面,结果第三面直接就是 HR 面了(
也是谈人生,聊了 20 分钟的样子。
# 三面
破案了,大佬面在 HR 面之后。
三面也是在聊人生,会聊项目和实习里的一些细节,但不是偏八股方面的细节,而是产品逻辑等方面的细节
# 360
# 笔试
选择题比编程题难.jpg
选择题题目 C++、Java、数据结构和算法、数据库、计网、OS 都有涉猎。编程题就是两个水题。
- 给定两个长度相同、只包含
A
和T
的数组。每次可以将一个字符串的两个字符交换位置,或修改一个字符串的一个位置。求将字符串一修改为字符串二的最少修改的次数 - 给定4个数字,分别表示1人队伍、2人队伍、3人队伍、4人队伍的队伍数,求最多能将其组合为多少个4人队伍(可以合并现有队伍,不能拆散)
# 星环科技
# 笔试
是本次秋招里,做过的最硬核的笔试了。两个小时全部用完,三道题只完整通过一题。
# 一面
# 搜狐畅游
# 笔试
搜狐畅游居然用的是 ShowMeBug (opens new window) 的系统。
36 道 Java 底层的选择连蒙带猜 + 2 道编程,不过编程不是算法题。
- 按照题目所属,实现生命游戏(元胞自动机)中的两个关键函数,其余函数均已实现。模拟即可。
- 将 1 题的所有函数封装为一个
GameOfLife
类,并新开一个新线程,在新线程中每隔一段时间更新一次生命游戏并输出当前结果。实现大体框架即可。
# 墨刀
# 一面
半个小时,不问八股,纯聊技术,面试官也介绍了墨刀的一些技术框架和细节,感觉挺有意思的。就和 Bitme 的面试体验一样,很难不心动。可惜就是小厂开的薪资可能没有大厂诱人(
# 二面
二面也是不聊八股,也没怎么聊技术。似乎是和部门的负责人聊。
# 华为 OD
因为一直没有 offer,就去华为 OD 走了一个流程,顺便实际体验一下看看 OD 能开多少。
# 一面
周一一面,一个小时,问了好多 Java 八股。比如:
static
final
关键字的作用HashMap
、HashTable
、ConcurrentHashMap
的区别
顺便,一面面试官没开摄像头。
# 二面
周三下午二面,二十分钟,只做了一道题。
- 求一个数组的连续子序列的积的最大值。
二面面试官也没开摄像头。
# 三面
周三晚上,三面面试官直接打电话,就没有开不开摄像头的问题了。
也是二十分钟,聊了聊项目和实习就没了。
反问的时候问了一下工作环境和氛围,面试官还罗列了一二三四点在华为工作和之前公司的一些区别,人还不错。
# HR 面
就是聊我的背景(家乡在哪里等等),然后就是谈薪了。