意向岗位:后端开发工程师 2023年秋招
2023年7月20日晚
以下是面试的主要提纲,凭回忆
自我介绍
我说了学历、主要项目经历、实习经历
实习
实习干了什么工作、在什么背景下解决了什么问题、觉得难点在哪
项目
就是让我介绍我的项目,从背景,到开发过程,我全聊了一遍。面试官顺便问了数据库
- 你的关键数据表是怎么设计的?(我没答范式,只答了具体的设计,并且说了设计的索引,诱导面试官问索引
- 你的索引是真的有效吗?(可以用
Explain
,并且我体感上时间得到了优化 - 问了最左匹配原则,假如设计了
(a, b, c)
的组合索引,哪些查询可以优化? - 问了索引的数据结构。(BTREE 和 HASH)
- ★问了
SELECT * FROM t WHERE a=1;
和SELECT f FROM t WHERE a=1;
有什么不同,其中索引建立在a上。(这个我答不上来,我觉得差不多的)
基础知识
操作系统
- 线程的基本概念。
- ★线程调度时的上下文切换。(我不是很清楚)
- 什么是死锁?现代操作系统、程序员怎么规避死锁的?(我答了触发死锁的四个条件,举例了一个死锁。操作系统怎么规避我不太清楚,我先扯了一下程序员怎么规避。
- ★继续问我操作系统怎么规避死锁。(我提了一下Go在运行前会检查,但是具体我不知道。
计算机网络
- 从浏览器输入 URL,到加载出网页,有哪些过程?(我答了 DNS 解析、发起请求并返回数据、前端解析。但是我感觉我说少了。
- 简单聊 TCP。
数据库
其实刚刚说项目经历时说过一次了。面试官又问了几个问题:
- ★MySQL 数据库并发时,有隔离级别,解决并发问题。(我记不清楚)
- ★MySQL 数据库有哪些锁。(我也记不清楚,只说了名字和大概用途,表级锁、行级锁、行间锁;写锁、读写锁)
中间件
- Kafka、Redis的应用场景。
- Kafka和其它消息队列中间件对比。(我直接说我不太清楚,我只用到了最简单的消息队列)
算法题
一道算法题,现场告诉你题目的内容。写出可以运行的伪代码(因为没有测试用例,我自己测试了几遍。)
如果是正式的机考题,应该有很多边界用例,会很麻烦。我就写了一个能覆盖大多数用例的代码,边界条件的地方就写了注释没去考虑。面试官说可以了。
题目是:
输入一个数字数组,形如
12 13 14 15 18 19 1 3 5 5 6 6 7 8 9 10
可以看作一个连续递增可重复的序列,从中间切断,再拼接得到的。
请问如何找到这个数组的中位数。
思路是找到切断点,可以用二分查找,在 的时间复杂度里找到。我的代码也如此。不过我和面试官简要讨论特殊情形:
- 所有的数字都一样
- 数组没有被切断(面试官说可以没有切断),就是递增序列
对于第二个特殊情形,我只做了一个简单的判断,没有严格判断。