Trong phát triển Web thực tế, khi một danh sách có hàng chục hoặc hàng trăm trang, ta không thể hiển thị tất cả các nút trang trên thanh phân trang (Pagination Bar) mà phải áp dụng thuật toán Cửa sổ trượt phân trang (Sliding Window Pagination).
Cho currentPage (trang hiện tại), totalPages (tổng số trang) và delta (số lượng trang hiển thị lân cận trang hiện tại ở mỗi bên).
Hãy viết hàm trả về một mảng số nguyên đại diện cho các nút trang hiển thị theo quy tắc:
- Luôn hiển thị trang đầu tiên (
1) và trang cuối cùng (totalPages). - Hiển thị các trang nằm trong khoảng
[currentPage - delta, currentPage + delta](nếu nằm trong phạm vi 1 đến totalPages). - Nếu có khoảng cách giữa các trang không liền kề, chèn số
-1để đại diện cho dấu ba chấm (...). - Không được có số trang bị trùng lặp và không có 2 dấu
-1đứng cạnh nhau.
Ví dụ 1:
Input:
currentPage = 5
totalPages = 10
delta = 1
Output: [1, -1, 4, 5, 6, -1, 10]
Giải thích: Trang 1 ... các trang quanh 5 là 4, 5, 6 ... trang cuối 10.
Ví dụ 2:
Input:
currentPage = 1
totalPages = 4
delta = 1
Output: [1, 2, 3, 4]
Giải thích: Số trang ít, không có khoảng cách nên không có dấu -1.
Định Dạng Đầu Vào (Input)
Dòng 2: Số nguyên totalPages
Dòng 3: Số nguyên delta
Định Dạng Đầu Ra (Output)
Ràng Buộc (Constraints)
1 <= currentPage <= totalPages <= 10^51 <= delta <= 5
Ví Dụ Kiểm Thử Mẫu
5
10
1
[1, -1, 4, 5, 6, -1, 10]
1
4
1
[1, 2, 3, 4]
Kỹ thuật Tập Hợp & Chèn Dấu Ba Chấm O(totalPages)
1. Xác định phạm vi lân cận: rangeLeft = max(2, currentPage - delta), rangeRight = min(totalPages - 1, currentPage + delta).
2. Đưa các trang 1, các trang trong khoảng range, và trang totalPages vào danh sách.
3. Duyệt danh sách để chèn -1 bất cứ khi nào khoảng cách giữa 2 trang kế tiếp lớn hơn 1.
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.



