-1

Java の頭の上で、short の 1-D 64 要素配列を反転する必要があります (簡単な場合は int に切り替えることができますが、どちらでも同じプロセスが機能すると思います)。実際の問題はチェス盤上にあるため、ここでは理解しやすいように正方形のテーブルとして表します。

例えば:

short[] example = new short[]
{
    1, 2, 3,
    4, 5, 6,
    7, 8, 9
};

次のようになります。

7 8 9
4 5 6
1 2 3

これは、配列を逆にすることと同じではないことに注意してください(私が見つけた同様の質問に対するすべての回答者がこの間違いを犯したため、質問する必要があります!)。配列を反転すると、次のようになります。

9 8 7
6 5 4
3 2 1

重要な情報を見逃していたら申し訳ありませんが、助けていただければ幸いです。

編集: 配列は 1D で、64 個の要素が含まれているため、短い [64] であり、逆の配列は元の配列とは別のものです。私が試した限りでは、頭を包み込むのに苦労しています。配列を逆にする方法は知っていますが、それは私が求めているものではありません。最初は次を使用してインデックスを逆にしようとしました:

byte index = (byte)(((byte)(position + 56)) - (byte)((byte)(position / 8) * 16));

これはChessbinで見つけたコード スニペットですが、これは正しくない値を返し、IndexOutOfBounds エラーが発生します。後から考えると、そのコードがインデックスを反転することを意図しているのか、逆にすることを意図しているのかは明確ではありません。数学は私の得意分野ではないので、別の配列で回避しようとしました。

4

2 に答える 2

2

私の提案は次のようになります。

public class Flipper {

    public short[] flip(short[] array, int columns) {
        short[] flipped = new short[array.length];
        for(int i=0;i<array.length;i++){
            int row = (i/columns); //use the fact that integer/integer is rounded down
            int column = (i%columns);
            flipped[i] = array[array.length-((columns*(row+1))-column)];
        }
        return flipped;
    }

}

次の方法でテストできます。

public class FlipperTest {

    private Flipper flipper = new Flipper();

    @Test
    public void test() {
        short[] array = new short[]{1,2,3,4,5,6,7,8,9};
        short[] actualResult = flipper.flip(array, 3);
        assertThat(actualResult, equalTo(new short[]{7,8,9,4,5,6,1,2,3}));
    }

}

コードが自明であることを願っています

于 2013-05-13T19:14:49.120 に答える
1

論理 2D 配列を表す物理 1D 配列があり、行を交換したいとします。これは、2D 配列インデックスを 1D 配列インデックスにマッピングすることで部分的に行うことができます。

heightを行数、をwidth列数とします。

for ( int i = 0; i < height/2; ++i ) {
    int k = height - 1 - i;
    for ( int j = 0; j < width; ++j ) {
        short temp = array[i * width + j];
        array[i * width + j] = array[k * width + j];
        array[k * width + j] = temp;
    }
}    

読みやすさのためにこれを書きました。ユーザーまたはコンパイラが、繰り返される計算の一部を最適化する場合があります。

2D 配列を使用すると、O(高さ * 幅) のすべての行をコピーするのではなく、O(高さ) の行への参照を交換できるため、さらに最適化できる場合があります。

于 2013-05-13T18:45:49.017 に答える