Betrachten Sie eine Permutation der ganzen Zahlen 1
, ... n
, wie diese für n = 6
:
[5,2,4,3,6,1]
Wenn Sie die Permutation als Zuordnung von [1,2,3,4,5,6]
zu betrachten [5,2,4,3,6,1]
, kann die Permutation in disjunkte Zyklen zerlegt werden . Ein Zyklus ist eine Teilmenge von Elementen, die einander zugeordnet sind. Beispielsweise 1
wird zugeordnet 5
, das zugeordnet wird 6
, das zurück zugeordnet wird 1
. Ein Zyklus ist also [1,5,6]
. Die anderen Zyklen sind [2]
und [3,4]
. Somit ist die Anzahl der Zyklen für diese Permutation 3
.
Im Allgemeinen sind die Zyklen einer Permutation eindeutig (bis zur Reihenfolge), und die Anzahl der Zyklen für eine Permutation der Größe n
variiert von 1
bis n
.
Die Herausforderung
Bei einer nicht leeren Permutation wird die Anzahl der Zyklen ausgegeben.
Eingang ist ein Array , gebildet durch die n
ganzen Zahlen 1
, 2
, ..., n
gegeben n > 0
. Jede Ganzzahl kommt genau einmal vor. Die Reihenfolge, in der sie angezeigt werden, definiert die Permutation wie im obigen Beispiel.
Anstelle eines Arrays können Sie eine Liste, eine Zeichenfolge mit einem Trennzeichen zwischen den Zahlen, eine separate Eingabe für jede Zahl oder alles verwenden, was sinnvoll ist.
Für eine Permutation der Größe n
können Sie anstelle der 1-basierten Menge von Ganzzahlen 1
... n
die 0-basierte Menge 0
, ..., konsistent verwenden n-1
. Wenn ja, geben Sie dies bitte in Ihrer Antwort an.
Der Code sollte für Arbeit n
an bis 20
in einer angemessenen Zeit, sagen wir weniger als eine Minute.
Code Golf. Alle eingebauten erlaubt.
Testfälle
Dies setzt eine 1-basierte Array-Eingabe voraus.
[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
verbunden
Diese verwandte Herausforderung fragt nach den tatsächlichen Zyklen der Permutation, nicht nach deren Anzahl. Das Erfordernis nur der Anzahl von Zyklen kann zu kürzeren Algorithmen führen, die die Erzeugung der tatsächlichen Zyklen umgehen.
1
, ..., n
in dieser Reihenfolge. Können Sie klarstellen, wie eine Zuordnung eine Eingabe sein kann? Ist es eine Datenstruktur?
dict
. Ich möchte {1: 2, 2: 1}
als Eingabe statt haben [2, 1]
.