Danh sách

Tính toán dải phân trang Web (Smart Pagination)

Dễ
Thuật Toán Web Thực Chiến (Practical Web Algorithms) 800ms 128MB

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 1: Số nguyên currentPage
Dòng 2: Số nguyên totalPages
Dòng 3: Số nguyên delta
Định Dạng Đầu Ra (Output)
Mảng các số nguyên đại diện cho các nút trang (với -1 là dấu ba chấm ...)
Ràng Buộc (Constraints)
  • 1 <= currentPage <= totalPages <= 10^5
  • 1 <= delta <= 5
Ví Dụ Kiểm Thử Mẫu
Ví dụ 1:
Input:
5
10
1
Output:
[1, -1, 4, 5, 6, -1, 10]
Giải thích: Có 2 dấu ba chấm ở 2 đầu
Ví dụ 2:
Input:
1
4
1
Output:
[1, 2, 3, 4]
Giải thích: Không có ba chấm
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 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.

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):
5 10 1
Kết quả kỳ vọng (Expected Output):
[1, -1, 4, 5, 6, -1, 10]
Dữ liệu đầu vào (Input):
1 4 1
Kết quả kỳ vọng (Expected Output):
[1, 2, 3, 4]
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