考虑整数... ... 的置换,例如1nn = 6:
[5,2,4,3,6,1]
如果将置换视为从[1,2,3,4,5,6]到的映射[5,2,4,3,6,1],则置换可以分解为不相交的周期。循环是相互映射的元素的子集。例如,1被映射到5,被映射到6,被映射回1。所以一个周期是[1,5,6]。其他周期是[2]和[3,4]。因此,此置换的周期数为3。
通常,排列的周期是唯一的(按顺序排列),大小排列的周期数n从1到变化n。
挑战
给定非空排列,输出其循环数。
输入是由形成的阵列n的整数1,2,..., n,其中n > 0。每个整数仅出现一次。如上例所示,它们出现的顺序定义了排列。
可以使用列表,在数字之间使用分隔符的字符串,每个数字的单独输入或任何合理的方法来代替数组。
对于大小的排列n,而不是基于1的整数集1,......,n你可以一直使用基于0套0,... n-1。如果是这样,请在您的答案中指出。
该代码应努力n达到20在合理的时间,说不到一分钟。
代码高尔夫。允许所有内置。
测试用例
假定基于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
有关
这个相关的挑战要求排列的实际周期,而不是数量。仅要求周期数可以导致产生实际周期的较短算法。
1...。n您能否阐明映射如何成为输入?它是数据结构吗?
dict。我想{1: 2, 2: 1}代替输入[2, 1]。