2016-11-16 5 views
2

私は他のリソースの中でも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; 
} 

タスクでなければなりません//...//を正しいコードに置き換えることです。私は自分の方法でこれをコード化できますが、ブール値の配列を使用しません。私が理解していないのは、boolean配列inCycleが置換配列にどのように接続されているかです。誰かが私にここのifループが何を意味するのかを説明することはできますか?前もって感謝します。

答えて

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 
関連する問題