Hãy xem xét một hoán vị của các số nguyên 1
, ... n
, chẳng hạn như số nguyên này cho n = 6
:
[5,2,4,3,6,1]
Nếu bạn xem hoán vị là ánh xạ từ [1,2,3,4,5,6]
đến [5,2,4,3,6,1]
, hoán vị có thể được dịch ngược thành các chu kỳ rời rạc . Một chu trình là tập hợp con của các phần tử ánh xạ với nhau. Ví dụ: 1
được ánh xạ tới 5
, được ánh xạ tới 6
, được ánh xạ trở lại 1
. Vì vậy, một chu kỳ là [1,5,6]
. Các chu kỳ khác là [2]
và [3,4]
. Do đó số chu kỳ cho hoán vị này là 3
.
Nói chung, các chu kỳ của một hoán vị là duy nhất (theo thứ tự) và số chu kỳ cho một hoán vị kích thước n
thay đổi từ 1
đến n
.
Các thách thức
Cho một hoán vị không trống, xuất ra số chu kỳ của nó.
Đầu vào là một mảng hình thành bởi các n
số nguyên 1
, 2
, ..., n
, nơi n > 0
. Mỗi số nguyên xảy ra chính xác một lần. Thứ tự xuất hiện chúng xác định hoán vị, như trong ví dụ trên.
Thay vì một mảng, bạn có thể sử dụng một danh sách, một chuỗi có dấu phân cách giữa các số, một đầu vào riêng cho mỗi số hoặc bất cứ điều gì hợp lý.
Để hoán vị kích thước n
, thay vì bộ số nguyên dựa trên 1 1
, ..., n
bạn luôn có thể sử dụng bộ dựa trên 0 0
, ..., n-1
. Nếu vậy, xin vui lòng cho biết nó trong câu trả lời của bạn.
Mã phải hoạt động n
tối đa 20
trong một thời gian hợp lý, nói ít hơn một phút.
Mã golf. Tất cả các nội dung cho phép.
Các trường hợp thử nghiệm
Điều này giả định đầu vào mảng, dựa trên 1.
[1] -> 1
[3,2,1] -> 2
[2,3,4,5,1] -> 1
[5,2,4,3,6,1] -> 3
[8,6,4,5,2,1,7,3] -> 2
[4,5,11,12,7,1,3,9,10,6,8,2] -> 1
[4,2,5,11,12,7,1,3,9,10,6,8] -> 5
[5,8,6,18,16,9,14,10,11,12,4,20,15,19,2,17,1,13,7,3] -> 3
[14,5,17,15,10,18,1,3,4,13,11,16,2,12,9,7,20,6,19,8] -> 7
Liên quan
Thử thách liên quan này yêu cầu các chu kỳ thực tế của hoán vị, chứ không phải số lượng của chúng. Chỉ yêu cầu số lượng chu kỳ có thể dẫn đến các thuật toán ngắn hơn mà tạo ra các chu kỳ thực tế.
1
, ..., n
theo thứ tự đó. Bạn có thể làm rõ làm thế nào một ánh xạ có thể là một đầu vào? Nó có phải là một cấu trúc dữ liệu?
dict
. Tôi muốn có {1: 2, 2: 1}
một đầu vào thay vì [2, 1]
.