字节暑期实习 - 后端开发三面(已拿offer,反馈牛客)
2020/3/11 - 12:00 - 56分钟
1. 自我介绍
2. 闲聊
为什么不读研
以后的职业规划
3. 讲讲第一个项目
先聊了技术方面的,然后又聊到项目管理、任务分配、收获等等。
4. 讲一下客户-服务端通信方式
大概讲了一下HTTP请求报文、响应报文。
5. 服务端之间的通信,RPC了解吗
听过,没了解过。
6. 讲一下HTTPS
HTTP+SSL,讲了一下SSL握手阶段,服务端会向客户端发送机构颁发的证书,其中包括机构私钥加密的服务器公钥,然后,(省略。。。
那假如第三方从中先拿到证书,然后,比客户端更快地与服务器通信呢?
瞎说了一通,也不知道对不对。。。
7. 知道序列化吗?知道怎么实现的吗
知道序列化,但不知道内部实现。。。
8. 讲一下redis和MySQL
redis是key-value型数据库、非关系型数据库,存储在内存中。
MySQL是关系型数据库。
9. 讲一下redis数据类型
10. redis中的set类型是如何实现的
我猜是红黑树(这里说错了,实际上是hash表。。。
11. 讲一下MySQL
两个主要的引擎。然后,大概讲了一下innodb引擎、事务、索引等。
12. 代码题
第一题
问题:
10亿用户数据中分别存在100个文件中,每个文件存储1000万行,每行一个用户信息 userId(32字节的字符串),活跃度(double),找活跃度数值最大的10000个userId和活跃度
这道题刘大佬三面的时候也问过,我也看了,结果当时脑抽,说成建一个大小10000的大顶堆。然后,面试官问我具体怎么实现,我还沿着最大堆说下去了(自己跳进了自己的坑。。。
后来,越说越不对。面试官就开始质问我,你没有发现什么问题吗?我才醒悟,是小顶堆。。。然后,就说了遍小顶堆怎么操作。
(这道题说完,心态有点崩。。。
第二题
问题:
有一个数组n个元素,随机等概率获取m个不同元素的方法?
刚看到题有点懵。懵了一会,说用随机数。面试官说,这样还是会取到重复元素啊。
那就把上一次取到的元素剔除。面试官又说,这样时间复杂度会很高吧。
那就取到重复元素时再随机一遍。面试官说,还是不行。
后面实现想不到,就跳过了。
(网上说正确解法是,蓄水池抽样算法。
第三题
问题:
输入n,输出n*n的二维数组,其特征如下: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
思路:
顺着规律走就行。面试官说,那你写一下,15分钟。
代码:
#include using namespace std; int main() { int n = 4; int num[n][n]; for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { num[i][j] = 0; } } int k=1; for (int i=0; i<n/2; i++) { //printf("%d\n", k); for (int j=i; j<n-i-1; j++) { num[i][j] = k; k++; } for (int j=i; j<n-i-1; j++) { num[j][n-i-1] = k; k++; } for (int j=n-i-1; j>i; j--) { num[n-i-1][j] = k; k++; } for (int j=n-i-1; j>i; j--) { num[j][i] = k; k++; } } if (k < n*n) num[n/2][n/2] = n*n; for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { printf("%d ", num[i][j]); } printf("\n"); } }