Danh sách

Giới hạn tốc độ yêu cầu (Rate Limiter Sliding Window)

Trung bình
Thuật Toán Web Thực Chiến (Practical Web Algorithms) 1000ms 128MB

Rate Limiting là một cơ chế phòng thủ tối quan trọng trong các hệ thống Web và API để chống lại các cuộc tấn công Brute-force hoặc DDoS và bảo vệ tài nguyên máy chủ.

Cho một mảng các thời điểm gửi yêu cầu timestamps (đơn vị: giây, đã được sắp xếp tăng dần), số lượng yêu cầu tối đa cho phép maxRequests, và cửa sổ thời gian windowSeconds.

Hãy viết hàm xác định xem mỗi yêu cầu có được chấp thuận hay bị từ chối theo nguyên tắc Cửa sổ trượt (Sliding Window Log):

  • Một yêu cầu tại thời điểm t chỉ được chấp thuận (true) nếu trong khoảng thời gian [t - windowSeconds + 1, t], số lượng các yêu cầu đã được chấp thuận trước đó nhỏ hơn maxRequests.
  • Nếu đạt hoặc vượt quá maxRequests, yêu cầu bị từ chối (false) và không được tính vào danh sách các yêu cầu đã chấp thuận.

Ví dụ 1:

Input:
timestamps = [1, 1, 2, 3, 5, 8]
maxRequests = 3
windowSeconds = 3
Output: [true, true, true, false, true, true]
Giải thích:
- t=1: 1 req -> true
- t=1: 2 req -> true
- t=2: trong [0..2] có 3 req -> true
- t=3: trong [1..3] đã có 3 req (t=1, 1, 2) -> false (bị từ chối)
- t=5: trong [3..5] chỉ có t=5 (do t=3 bị từ chối) -> true
- t=8: trong [6..8] chỉ có 1 req -> true
Định Dạng Đầu Vào (Input)
Dòng 1: Mảng timestamps
Dòng 2: Số nguyên maxRequests
Dòng 3: Số nguyên windowSeconds
Định Dạng Đầu Ra (Output)
Mảng boolean [true, false, ...] tương ứng cho từng yêu cầu
Ràng Buộc (Constraints)
  • 1 <= timestamps.length <= 10^5
  • 1 <= maxRequests <= 1000
  • 1 <= windowSeconds <= 3600
Ví Dụ Kiểm Thử Mẫu
Ví dụ 1:
Input:
[1, 1, 2, 3, 5, 8]
3
3
Output:
[true, true, true, false, true, true]
Giải thích: Request thứ 4 tại t=3 bị từ chối
Ví dụ 2:
Input:
[1, 2, 3, 4]
2
5
Output:
[true, true, false, false]
Giải thích: Cửa sổ 5s chỉ cho phép tối đa 2 req
Gợi ý được sắp xếp theo cấp độ tiến dần. Hãy mở từng gợi ý khi bạn thực sự cần thêm định hướng.

Kỹ thuật Hàng Đợi Cửa Sổ Trượt (Sliding Window Queue) O(n)

Duy trì một hàng đợi Queue chứa các timestamp của những yêu cầu đã được chấp thuận.
Tại mỗi timestamp t:
1. Loại bỏ khỏi đầu Queue tất cả các timestamp cũ nằm ngoài cửa sổ (ts <= t - windowSeconds).
2. Kiểm tra nếu queue.length < maxRequests: Chấp thuận (true), đẩy t vào Queue.
3. Ngược lại: Từ chối (false), không đẩy vào Queue.

Vui lòng đăng nhập

Đăng nhập tài khoản học viên để xem lịch sử nộp bài của bạn.

Đăng nhập
Ctrl + Enter: Chạy thử
Dữ liệu đầu vào (Input):
[1, 1, 2, 3, 5, 8] 3 3
Kết quả kỳ vọng (Expected Output):
[true, true, true, false, true, true]
Dữ liệu đầu vào (Input):
[1, 2, 3, 4] 2 5
Kết quả kỳ vọng (Expected Output):
[true, true, false, false]
Nhập STDIN của bạn (Mỗi dòng một tham số):

Bấm Chạy thử để kiểm tra các bộ test mẫu hoặc Nộp bài để chấm điểm chính thức.

Đang gửi mã và thực thi trên Sandbox Engine...
Nhấn Ctrl+Enter để chạy

vừa nâng cấp PRO khóa 1 phút trước   Tìm hiểu khóa học