春招-微派一面

🕐面试时间:2026.04.02

春招唯一挂的一家

自我介绍

开局2个手撕:

1.leetcode200-岛屿问题

2.leetcode210-课程表2(BFS拓扑排序/ DFS 逆后序)

hot100变形就算了,来了个图论的变形,和hot100的课程表1的思路完全对不上啊,甚至几乎参考不了,这第二题硬控我40分钟,我跟面试官说思路想着主动结束,他说OK思路没毛病你继续写吧,然后我说写不出来他说再试试,后面看了下题解,根本和变形题无关,于是释怀。过程还挺搞笑的,面试官现场教我说他的思路,然后他说着说着最后我跟他说面试官你好像理解错题目了,你可以重新看看题目要求,然后他才发现他说错了,然后说其实差不多,让我继续写......我写个damn的图论啊,出题的人都看错题目了这咋搞?

JDK1.7和1.8的HashMap和ConcurrentHashMap的结构

你知道1.7HashMap修改后变的更安全了吗?为什么?

头插法为什么就安全了?你说一下头插法的流程以及会造成什么问题?

为什么ConcurrentHashMap就并发安全了?

1.8后的HashMap频繁插入后会有什么问题?

说一下AQS的底层?锁中心化问题,CLH队列

你刚刚提到了Volatile对吧?说一下Volatile的作用是什么?

你说Volatile保证了内存可见性,那它能保证原子性吗?

说一下JVM的内存结构

为什么它新生代和老年代选用不同的标记算法呢?这里面新生代和老年代的算法不同肯定是会有考量的?你说一下为什么要这样子设计?性能方面?内存大小方面?

确实是性能会更好,这个确实,但是我要你结合实际说,为什么这个新生代回收的性能会更好?既然性能好为什么老年代不用这个算法?肯定是他们有其他的限定条件,所以才分别选择了不同的算法,你说说具体的原因

说一下内存泄露问题你的排查思路,说一下常见的问题,以及你是怎么排查的

Mysql的MVCC

除了临键锁和间隙锁,还有什么东西是可以用来解决幻读的?

说一下Mysql的ACID

InnoDB引擎为什么用B+树而不用B树你有了解吗?

Redis的Zset的底层是什么数据结构

为什么不用B树代替跳表?

你说范围查询B树的查询效率比跳表低这是为什么?是什么根本的原因导致他们的性能在范围查询的时候低的

那Zset为什么选用跳表呢?平衡树和红黑树不行吗?他们就是适用于范围查询的为什么不选择平衡树和红黑树?跳表对比平衡树和红黑树的优势在哪?

介绍一下Spring的IOC

介绍一下Spring的循环引用问题

你说Spring的三级缓存可以解决循环引用问题,但是其实二级缓存就可以解决循环引用问题,那你知道Spring三级缓存的结构分别放的是什么东西吗?

SpringAOP说一下

介绍一下Bean的生命周期,有几步,分别是什么

场景题(基于微派的实际场景出的,设计的很巧妙跟脑筋急转弯一样)

我们现在要设计一个排行榜嗯,这排行榜要谁先到的谁就在前面,这个就是分数就是分数而且是整数,所以不用考虑分数小数的情况,如果分数如果相同的话,谁先到的排前面。这个怎么设计?有没有办法?而且这个排行榜是实时变动的,例如几W个用户的分数都在实时变动,你通过怎么样的数据结构,怎么样的设计,去保证这个排行榜的排序一定是【第一个到XX时间的XX分数的玩家】排在第一个,其他玩家就算到了这个分数也是要排下面

排行榜很简单,结构肯定就是单纯的一个Zset。但是呢维护一个排行榜的更细致的东西就要有点巧思了,这个我说了一堆Zst的东西和各种处理去维护,但是根本不如实战中那种巧妙的设计,这种要是实战没弄过或者没有做过对应的算法题可能确实想不到

我的思路结构是把Score和时间戳TIME拼接成字符,例如Score_TIME,这样子在排行榜展示的接口逻辑中在内存中二次聚合处理就可以成功展示了,面试官跟我说存的不要String就要单纯的数字也就是Integer和Double类型处理,这个我确实想不到了,但是面试官给的实战解决方案是直接用Double就能解决,省去了内存聚合处理这一块逻辑, Redis的Zset中存的就是增量的结果,只能说这个确实太巧妙了

我的思路:Score_Time,重要信息都存后,展示前在内存中根据信息二次聚合重排,可以成功展示

面试官的思路:选用浮点类型Double,然后小数前的数字是【分数Score】,小数点后的数字是一个无限大的数字可以理解成无限大的9999999999

结构:[分数Score].9999999999

目的在于相同分数的时候,最先到达这个分数的,那个用户排在最前面

zset中key是用户ID,value就是Double类型的[分数Score].9999999999

已知:

  1. 时间戳是递增的
  2. 时间是重要信息,排行榜展示的时候也有时间,所以每次更新分数都要更新时间戳

最终方案:

小数点后无限大的数字减去时间戳,就能实现同分的情况下,最先到达这个分数的用户排在最前面了

人话:

假如2个用户都到了27分

用户A到达这个分数的时间戳是111111,这个数字变成0.111111作为减去的参数

用户B到达这个分数的时间戳是222222,这个数字变成0.222222作为减去的参数

显而易见的是用户B到达分数27比用户A晚

那么按照上面的思路,分数是27,初始化时小数点后是无限大的数字

也就是27.999999.....这里就拿6个9来举例子

然后开始减去操作

用户A:27.999999-0.111111 = 27.888888

用户B:27.999999-0.222222 = 27.777777

用户A最后算出的值是大于用户B的,这样子就能保证同分的情况下,最先到达这个分数的用户排在最前面了

因为每次互动都是 分数.9999999减去0.xxxxxx,时间越晚那么小数点后的数字就越小,时间最早那么小数点后的数字就越大

相当于比较版号,27.7就是比27.8新

最后还是挂了,这个拓扑排序真不是人写的,这个场景题设计的也太巧妙了,虽然挂了但还是有点收获,最搞笑的事我朋友面微派也是这个面试官,仍然是这两个手撕,仍然是课程表2写不出来,但这次面试官好像没看错题了hhh

#牛客AI配图神器#

#春招##发面经攒人品##面试##我的求职进度条#
全部评论

相关推荐

05-19 16:41
复旦大学 Python
ynq2126:我一直觉得现在考算法题没啥意义 真要选拔人才不如把公司实际项目中遇到的问题当成一系列场景题抛给求职者答 这才是能检测能力的东西
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务