面试整理:21年4月某大厂的技术面试题及答案整理

265 阅读3分钟

以下是近期某外卖大厂某部们的真实面试题,技术和算法部分,供参考。

1、线上问题排查

比较经典的,线上cpu飙高时,怎样定位到问题的代码级别。

可以参考这边:CPU飙高和内存飙高的一般处理步骤。关键步骤:

1、top定位进程,-Hp 定位线程

2、得到问题线程id后,16进制转换,到stack日志中匹配查找问题线程日志信息,判断具体线程信息

3、例如确认是gc线程,那么就继续进行内存分析,一般是内存泄露或分配不当导致频繁gc。接下来就是定位内存泄露位置 或 调整内存空间。

2、redis数据结构,hash 和 zset特点,什么时候使用,zset范围查找的时间复杂度

先说结论:"范围查找" 时间复杂度平均是 O[(LogN)+M] M是返回的元素个数

相关解析

Redis Zrange 范围查找 (分页)- 底层分析 juejin.cn/post/684490…

Redis Zrange 是有序集合( SortedSet ) 提供的一个命令,可以返回有序集中指定区间内的成员,而有序集合比较有用的一个功能就是 "范围查找" 时间复杂度平均是 O[(LogN)+M] M是返回的元素个数,有序集合底层是通过字典+跳跃表的方式来实现的。而范围查找,则是使用了span 字段。

如果不加这个span字段那么就只能退化成从最低层节点开始的位置不断的向后遍历直到找到我们要的范围起始位置节点,那么最终的时间复杂度也就是O(n),然而加上这个span字段之后,也可以跟查找分数的方式一样从最高层利用span这个字段(记录距离下一个节点的距离),去不断的累加span值判断是否小于等于我们的起始位置,如果不等于则判断是否当前就是我们的起始位置,如果也不是那么就降下来一层继续累加span,跟查找分数的方式基本一样.

举个栗子:

查找 > zrange key 5,2

那么就从最高层开始计算,首先

level4 -- score:0-span:1 + score:10-span:4 == 5

level3 -- ....

level2 -- ....

这样的话直接计算出来 score:20 是第5个节点,那么就确认了,也就代表直接定位到了第5个节点指针位置,那么最后就会在最低层以这个score:20节点指针作为开始位置不断向后获取2个节点然后返回结束.

所以使用 zrange 这个命令去范围获取,平均的时间复杂度就是 O[(LogN)+M],最坏的情况O(n)

3、mongodb使用,进程,为什么使用mongodb,是否可以用Hbase 或 mysql

mongodb集群,主要包括mongos 和 mongod进程。mongos相当于路由层,负责转发控制,包括分片的块如何迁移,都在mongos中进行控制;mongod则是类似mysql的InnoDB的数据引擎进程,负责数据存储和数据访问、修改等能力提供。

4、mysql锁的理解

mysql使用较多,对锁的理解,什么是乐观锁、悲观锁,什么时候/为什么使用间隙锁

5、死锁发生条件

两个事务同时,事务1 锁A,申请B;事务2锁B,申请A;互相等待依赖状态。总结:相互依赖,顺序不同-正好相反;

6、算法题:求最早公共交点

求两个单向链表的最早公共交点;如果没有返回null。

相关解析请参见文章:求两个单向链表的最早公共交点