我是一个通过codefirts.org和其他资源进行编码和学习的新手。我偶然发现这个问题:
======
求给定置换的循环数。
例子
对于排列=[1,3,2,6,4,5],输出应该是
置换循环(置换)=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;
}

任务是用正确的代码替换//…/。我可以用自己的方式编写代码,但不需要使用布尔数组。我不明白的是循环中的布尔数组是如何连接到置换数组的。有人能给我解释一下这里的if循环是什么意思吗?提前谢谢。

最佳答案

如果我理解这个问题,应该是

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

10-07 13:00
查看更多