字节一面,服务端开发实习生-移动OS岗位,飞书?
- 自我介绍
- JVM内存结构,垃圾回收算法
- java的垃圾处理器,你觉得G1与其它的有什么区别
- redis的主从集群,
- redis的数据同步机制
- redis 的主节点挂了会咋样,哨兵模式中怎么选取的?
- RDB和AOF
- TCP三次握手过程
- 为什么要三次握手?,两次会发生什么?
- mysql建联合索引
- 项目中的排行榜怎么做的?插入的时间复杂度是多少?
- 算法:全排列
- 手撕:简易限流器。。。写了20多分钟,还写是写成一坨
- 还有什么想问的吗
- 面试官:感谢你的时间
1h,面试官没开摄像头,手撕的时候引导了一下,挺好的,可惜了,到底是谁在找实习啊!!!!!!
public class SlidingWindowRateLimiter {
private final long windowSizeMillis;
private final int maxRequests;
private final Map<String, Deque<Long>> clientRequests;
public SlidingWindowRateLimiter(int M, int N) {
// 将秒转换为毫秒
this.windowSizeMillis = M * 1000L;
this.maxRequests = N;
this.clientRequests = new HashMap<>();
}
/**
* 检查客户端请求是否允许通过
* @param clientId 客户端ID
* @param currentTime 当前时间戳(毫秒)
* @return 是否允许请求
*/
public boolean allowRequest(String clientId, long currentTime) {
// 获取或初始化客户端的请求队列
Deque<Long> queue = clientRequests.computeIfAbsent(clientId, k -> new ArrayDeque<>());
// 移除所有过期的请求(早于当前窗口的起始时间)
while (!queue.isEmpty() && queue.peekFirst() < currentTime - windowSizeMillis) {
queue.pollFirst();
}
if (queue.size() < maxRequests) {
// 记录当前请求时间
queue.addLast(currentTime);
return true;
} else {
return false;
}
}
}
#牛客在线求职答疑中心#