每次约1个小时,先问大量基础知识和系统设计方面的问题,然后做再做两道算法题。做算法题的时候面试官经常会提醒,会给一些思路,所以题目方面的难度并不大。整体来说,题目做得比较顺利,但是基础知识和系统设计方面答得不好。
面试时间:2020.02.13 – 2020.02.14
一面
问了一些基础知识(比如python的GIL,http 状态码,TCP和UDP的区别,TCP拥塞控制,restful),还有一些项目上的问题,然后做题
- 第一题:只使用加减乘除等基本运算实现正整数的开方(二分)
- 第二题:有N个台阶,每次只能走一步或两步,先走完全部台阶为获胜,有两个人甲和乙,甲先走,判断在什么情况下甲一定会先到。第二题有点古怪,在理解题目时花了好长时间,最后我发现这不就是个判断奇偶数的问题吗,如果为奇数甲一定获胜,否则不一定…但是这个题也太简单了,面试官似乎不是这么想的,他说他想要的是让我从程序上进行证明,但是我给他从数学上讲通了,也行吧…
二面
先问知识点,虽然我投的是后端开发,但是面试官对我机器学习的经历很感兴趣,所以问了蛮多机器学习上的知识:
- 全连接的缺点(过拟合)
- 如何解决过拟合(调整数据、全连接时随机dropOut、L2正则)
- 解释L2正则 (忘了)
- 如何解决长尾分布的数据 (勉强记得一个focus loss)
后面答得不好,面试官然后就开始问系统上的,
- 爬虫,爬很多的数据,如何去重?
所有的URL放redis set里,自动去重
- 如果url很长、很多呢?
Hash一下,把url都映射到相同长度
- 如果数据有很多,Redis放不下呢?
上Redis集群
- 如果还是放不下呢?
记每条数据存储时的时间戳,把时间戳较老的数据移动到硬盘上。
还有一些基础知识,比如python是如何实现动态类型的,Java的强弱引用,Redis底层是怎么存储数据的,Redis 有序集合的原理,是否了解RPC
开始做题
- 1.从一个二维的字符串数组中,匹配一个小字符串,每次可以从上下左右匹配,但是不能超出数组范围
参考leetcode: 单词搜索(middle)
典型的回溯题,写得很顺利,写完之后面试官提醒了几处bug,然后问面试官要不要跑一下,他说不用了,他看了没问题,直接开始下一个
- 2.给定一条长度为N的绳子,切绳子,求如何切使得每段绳子的长度的乘集最大
参考leetcode 剪绳子(middle)
典型的动态规划题,最后有一点卡住了,正在思考的时候面试官直接告诉我思路了,然后就结束了。
三面
压力比较大,问了很多系统设计上的问题,很深入,并且最后给只给了10分钟左右的时间做一道算法题。
先是问了一些职业规划上的问题,比较随意。
然后开始问多线程方面的问题:
1.5000个客户端tcp长连接到服务器,json(id1 id2 money),服务端多线程并发处理并执行转账处理。
一开始没什么思路,然后面试官开始提醒,主要是数据库方面的操作
首先是以保证以事务为单位进行,然后为了提高并发性,每次操作只锁定要处理的行,但是一次操作可能涉及多个行,所以每个线程要先进入数据库完成所有相关行的锁定操作后才允许其他线程进入。
2.10亿用户数据中分别存在100个文件中,每个文件存储1000万行,每行一个用户信息 userId(32字节的字符串),活跃度(double),找活跃度数值最大的10000个userId和活跃度
建小顶堆,描述建堆的过程,以及算法复杂度。
在建堆的时候,有些数据可能是频繁更新的,有些更新的次数很少,如何优化?(没思路)
其它还有:
Redis为什么被经常用来做排行榜相关的业务(有序集合)
Redis集群上如何保证数据的同步
是否了解MySQL的索引(因为不知道,所以没继续问)
RPC的协议及原理
最后做一个题, 有序数组每个数平方后,不同数字的个数
要求算法时间复杂度O(n),空间复杂度O(1)
双指针问题,从大于0的地方开始向两边遍历
总结:
1.算法题的难度自身在easy-middle,有面试官的思路提示,因此难度并不大
2.系统设计偏好的题目有:
- 1.Redis相关,存储原理,Redis集群,主从模式,Sorted Set
- 2.分布式相关,RPC的协议和原理
- 3.多线程,并发
- 4.MySQL相关,行锁,表锁,聚簇索引
- 5.数据结构相关,堆
3.基础知识点:
- 1.TCP、UDP (在浏览器上输入一个网址,经历哪些步骤)
- 2.Restful 风格
- 3.http code
点击量:3229