一面(3.12,1h)
1.自我介绍
2.实习是自己找的还是学校找的(自己)
3.项目相关
- 介绍项目
- 介绍下令牌桶算法
- 令牌桶算法和漏斗算法的区别
- 如果令牌桶一秒放一个令牌,但是10秒才来一个请求,这样的话放令牌的那个线程就浪费了令牌资源,能不能来一个请求就放一个令牌?
- 答:我觉得这样做违反了令牌桶的概念,如果此时一下来了10个请求呢,你那种做法满足不了我这个情况。(面试官说:我的意思是 每次去令牌桶取令牌的时候都去统计一下该生成多少个令牌,就能满足我的要求了。不过我觉得你这个答法答的还可以)
4.介绍下 GC 算法(八股文)
5.你了解 STW 吗(八股文)
- STW 为什么要暂停所有应用线程
- 如果并发执行的话会有浮动垃圾,而浮动垃圾会导致 Concurrent Mode Failure 异常
6.说下 HashMap(八股文)
- 扩容为多大(两倍)
- 为什么两倍(这样数组的大小永远都是2的幂次方,可以使用位运算代替取模运算,提高效率)
- 1.8 以后有什么变化
7.TCP 三次握手四次挥手(八股文)
- 为什么挥手要四次
- 为什么要有 TIME_WAIT 状态
- 说下快重传(这里没答好,忘记了)
- 了解 TCP 的 no_delay 吗(不了解)
8.HTTP 状态码(八股文)
- 被限流后返回什么状态码(返回 20X,蒙的)
- 了解 429 吗(不了解)
9.浏览器输入 url 后发生了什么(八股文)
10.DNS 用的 TCP 还是 UDP(蒙了个 TCP。正确答案是:DNS占用53号端口,同时使用TCP和UDP协议。)
11.抓包 HTTPS 报文,里面有什么东西(密文)
- 你能看到哪些内容(懵了,没有做过实验)
- 你能看到域名吗(能看到。乱蒙的)
- 为什么能看到(不能看到的话怎么请求响应(继续蒙))
- 但是域名可以服务端解密啊,作为中间人的话能不能看到域名(应该看不到。蒙的)
- 其实可以看得到。你为什么上不去 Google 就是这个原理(不懂)
被耍了一波,哭了。
12.访问 80 端口,然后重定向到 443 端口。假如在访问 80 端口的时候,被中间人劫持了,不给你重定向到 443 端口,直接返回 HTTP 报文。HTTPS 怎么解决这种情况(这里讨论了一下,要通过 CA 证书证明)
13.介绍最左前缀原则(八股文)
14.线上查询接口比较慢,怎么定位(先排查代码效率;再排查 SQL,看是否命中索引)
- 如果没有命中索引,你该怎么加索引呢
15.主键为什么要自增(维护索引方便,直接往后插入,不需要往中间插)
- 往中间插入有什么问题(索引节点会分裂,影响效率)
16.算法题:字符串删除掉连续的3个重复的字符。比如 "abbbc",返回"ac";"abbbaac",返回"c"
- 说思路
- 时间复杂度
17.有什么要问我的吗
- 我有哪些需要加强的地方(代码写的不是很流畅,大体思路很清晰;基础还可以,但是深入的话还需要加强)
二面(3.16,2h)
腾讯会议面试
1.直接发来一套在线笔试题:基础知识选择题 + 算法题(二叉树非递归遍历、LRU、数组中重复的数字 ) + 简答题。花了一个小时
2.设计 hash 函数(取模,这样更加散列)
- 初始大小设为多少(2 的整数次幂,这样可以使用位运算代替取模运算,提高效率。面试官好像不认可)
3.设计数据库表,一个老师可以教多个课程,一个课程只能被一个老师教,一个学生能选修多门课程,一个课程也能被多个学生选修。(一个 teacher 表,一个 course 表,course 有 teacher_id 的外键,一个 student 表,因为学生和课程是多对多,所以需要一个中间表维护关系)
4.name LIKE "张%" 会命中索引吗(会命中索引,因为是以张开头的,因为 B+ 树有序,所以可以根据张来进行查找)
- name LIKE "%张%" 会命中吗(不会,因为不知道 "张" 前面还有什么字符,所以 B+ 树无法查找)
- name LIKE "张%" age < 21,这种可以使用索引吗(可以啊,建立一个联合索引(name, age))
5.写个 SQL,查询选修语文课程且年龄小于 21 姓张的学生(一顿连表查,简简单单)
6.5.9 亿个 IP 地址,都为白名单,判断某个 IP 是否在该白名单中,内存管够(HashMap、布隆过滤器、桶排序,看在哪个桶的范围内,桶内二分查找)这个问题扯了好久,面试官一直问还有没有别的;如果白名单是动态的呢,怎么维护布隆过滤器。
7.二分查找和 HashMap 哪个比较省内存(二分查找)
- 哪个更快(HashMap 更快,为 O(1);二分查找 O(logn))
- 为什么二分比较省空间(因为二分查找使用数组;HashMap 用拉链法解决冲突,链表中会维护 next 指针)
8.用什么做主键比较好(自增主键比较好)
- 用学号做主键可以吗(会有点问题,因为学号不是自增的)
- 为什么自增的好(因为自增的话 B+ 树直接往后面插入就行了,不是自增的话会往中间插入,往中间插入有可能会分裂节点,增加开销)
9.有多个 IP 请求过来,如果某个 IP 超过了 10次调用/5秒,就限流。使用 MySQL/Redis 实现,使用内存来实现,分别给两个解决方案。(这里我扯了一大堆有的没的,耽误了很长时间。内存实现:一个 IP 对应一个令牌桶线程;面试官说这样大体是可以,但是会有内存限制,说勉强过吧。MySQL/Redis 我一直想不出来,面试官就说跳过)这道题花了 20 多分钟。
后面思考的几种思路:
内存实现:
- 每个 IP 对应一个大小为 10 的循环队列,队列里面存储请求的时间。比如现在队列满了 10 个,第 11 个请求来了,就拿第 11 个请求的时间减去第一个请求的时间,如果小于等于 5 秒,就拒绝第 11 个请求,如果大于5秒,就删掉第一个请求,再把第11个请求加入循环队列。
- 用个 HashMap 来存令牌,key 就是 ip,value 就是对应的令牌,每次放的时候就放所有 ip 的令牌,频率为 10次调用/5秒。
- 滑动窗口,一个 ip 对应一个滑动窗口类
Redis 实现:
- 使用 zset 实现滑动窗口,key 是 ip,value 是请求次数,score 是时间,可以使用 zrangebyscore key startScore endScore 查看局部分数范围内的值,可以用来统计滑动窗口中的请求次数。
10.TCP 的 TIME_WAIT(八股文)
11.TCP 拥塞控制(八股文)
12.TCP 连接中怎么判断对面断开了(蒙了一个:会有异常)
13.介绍下项目
- 你做了什么
14.使用 golang 有没有问题
15.什么时候可以实习(暑期)
16.你有什么想问的
- 我问:我觉得我今天发挥的不太好,你对我有什么建议吗
答:没啥建议,我觉得你很急躁,第 9 道题回答的不是很好,数据库你还可以,毕竟做过项目的。
- 我问:下一轮还是技术面吗
答:是的
- 我问:有转正机会吗
答:暑期实习不错的话是可以转正的
- 我问:是做产品,还是来一个项目就做一个项目
答:物联网开发平台产品迭代
面了两个小时,感觉被榨干。
三面(3.18,19min)
1.系统性能怎么改善(不会,乱扯一通。加机器、CPU转速更快)
2.TCP、UDP 区别(八股文)
3.TCP 为什么可靠(八股文)
4.SELECT、EPOLL 区别(八股文)
5.HTTP 协议说下(八股文)
6.MySQL 遇到过什么问题(说了下索引失效)
7.为什么学 Java(学校课程教了 Java,我就选择了 Java 这个方向,扯了下自学的过程)
8.能不能接收转 C++(我说语言只是工具,随便换)
9.什么时候来实习(暑期)
面试官直接说过了。
全部评论
(15) 回帖