我是codefights.org编码和学习的新手,还有其他资源。我偶然发现了这个问题:
==
找出给定排列的周期数。
示例
对于置换= [1,3,2,6,4,5],输出应为 permutationCycles(置换)= 3。*
int permutationCycles(int[] permutation) {
boolean[] inCycle = new boolean[permutation.length];
int result = 0;
for (int i = 0; i < permutation.length; i++) {
if (!inCycle[i]) {
int position = i;
while (!inCycle[position]) {
inCycle[position] = true;
position = //...// ;
}
result++;
}
}
return result;
}
任务是用正确的代码替换//...//。我可以用自己的方式编写代码,但不使用布尔数组。我不明白的是布尔数组inCycle如何连接到置换数组。有人也可以向我解释这里的if循环是什么意思吗?提前谢谢。
答案 0 :(得分:1)
如果我理解这个问题,那应该是
position = permutation[position] - 1;
这将带您进入当前周期的下一个元素。我使用permutation[position] - 1
而不是permutation[position]
,因为示例中的索引从1开始,而Java数组则基于0。
布尔数组用于标记已访问过的元素(因此属于您已经计算过的某个循环)。
对于排列[1, 3, 2, 6, 4, 5]
,执行如下:
i == 0
position = 0
position = permutation [0] - 1 = 0 -> this closes the first cycle
i == 1
position = 1
position = permutation [1] - 1 = 2
position = permutation [2] - 1 = 1 -> this closes the 2nd cycle
i == 2 already in cycle
i == 3
position = 3
position = permutation [3] - 1 = 5
position = permutation [5] - 1 = 4
position = permutation [4] - 1 = 3 -> this closes the 3rd cycle
i == 4 already in cycle
i == 5 already in cycle