0

配列を反復処理する関数を作成しようとしています。特定のタイプの値が見つかると、定義された数の場所で右にシフトします。

一時的に値を格納し、右側の要素を左側にシフトしてから、一時的な値を正しい場所に書き込むことで、要素をシフトする方法を知っています。

私が苦労しているのは、特定の文字が配列の終わり近くに表示される場合、それをラップアラウンドして配列の先頭から続行する必要があるため、循環です。

したがって、配列は、たとえば、大文字を右に3桁、特殊文字を左に1桁シフトします。

{ M, y, N, a, m, e, P} becomes...
{ y, M, P, a, N, m, e}

8の要素を右にシフトするには、下の3つの場所に配置しますが、これは、8が配列の最後から3つの要素よりも前に表示され、ラップアラウンドしない場合にのみ機能します。

入力配列:

{0, 1, 2, 3, 4, 5, 6, 7, **8**, 9}

必要な出力:

{0, **8**, 1, 2, 3, 4, 5, 6, 7, 9}
int[] array = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

for (int i = array.Length - 1; i >= 0; i--) 
{
    if (array[i] == 8) 
    {
        int temp = array[i];
        int j = 0;
        for (j = i; j < i + 3; j++) 
        {
            array[j] = array[j + 1];
        }
        array[j] = temp;
    }
}
4

2 に答える 2

2

モジュロ演算を使用して、jシフト時に index の要素に書き込むのではなく、 index の要素に書き込むようにしますj % array.Length。したがって:

public void FindAndShift<T>(T[] array, T value, int shift) {
    int index = Array.IndexOf(array, value);
    int shiftsRemaining = shift;
    for(int currentPosition = index; shiftsRemaining > 0; shiftsRemaining--) {
        array[currentPosition % array.Length] = array[(currentPosition + 1) % array.Length];
    }
    array[(index + shift) % array.Length] = value;
}

エラーチェックを除外しました。

于 2011-04-17T19:09:17.780 に答える
0

ifステートメントを使用してこれを行うことができ、配列の終わりの前に十分なスペースがあるかどうかを確認し、そうでない場合は、配列の最初でシフトするステップ数も計算する必要があります。

また、シフトを行うときに配列の長さを法として位置を計算することでそれを行うことができると思います。現時点では試すことができませんが、私の頭の中のロジックはそれが機能するはずだと言っています。

于 2011-04-17T19:06:24.140 に答える