我找到了这个面试问题,并想知道是否有任何好方法可以解决它。我们有一个输入数组[0,1,2,3]和一个模式数组,例如[3,1,2,0],模式数组的作用是我们应该通过将索引为3的元素放到第一个位置来重新排序输入,然后将元素放在索引1到第二个位置等因此,在一次迭代之后,[0,1,2,3]将变为[3,1,2,0],在使用相同模式重新排序的另一次迭代之后,它再次变为[0,1,2,3]。
问题是我们需要多少次迭代给定一个模式,以便它回到原始顺序,并且在给定某个重新排序模式的情况下,输入数组是否可能永远不会回到原始顺序?
这就是问题,我自己只知道如何蛮力解决它 - 继续迭代它直到它与原始输入的顺序相同。关于它是否可能永远不会回到原始订单,我的方法是记录我们目前所见的所有订单,当我们发现已经访问过的订单时,我们意识到有一个循环,我们可能永远不会回到原本的。 我在这一段中的分析可能没用,所以请随意忽略它......
答案 0 :(得分:4)
有一种排列符号,称为循环符号,在这种情况下可以帮助你。示例模式的循环表示法是:
(0 3) (1 2)
表示:位置0
的条目转到3
位置。位置3
的进入位置0
(只是环绕)。位置1
的条目转到2
,2
转到1
。它也有可能获得更大的周期,例如:
(0 3 1) (2)
对于这种排列,结果如下:
a b c d
It 1: b d c a
It 2: d a c b
It 3: a b c d
因此,这种情况需要三次迭代才能恢复原始顺序。该数字可以直接从循环符号导出。在第一个示例中,有两个循环,每个循环有两个条目。所需的总周期数是最不常见的多个lcm(2, 2) = 2
。在第二个示例中,它是lcm(3, 1) = 3
。
导出循环符号并不太难。你只需要迭代模式。如果您遇到的某个条目尚未成为循环的一部分,请按照其在模式中的路径并记住循环的长度。这将为您提供所有包含周期的长度。最后,计算LCM并将其作为结果报告。