-1

我需要翻转一个一维 64 元素的短裤数组(如果它更容易,我可以切换到整数,但我假设相同的过程适用于任何一个)在 Java 中的头部。为了便于理解,我在这里将它表示为一个方桌,因为实际的问题是在棋盘上。

例如:

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

抱歉,如果我错过了任何重要信息,我们将不胜感激!

编辑:数组是一维的,包含 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 数组索引来部分地做到这一点。

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;
    }
}    

我写这个是为了可读性。您或编译器可能会优化一些重复计算。

您可以通过使用二维数组进一步优化,这将允许您交换对 O(height) 中的行的引用,而不是复制 O(height * width) 中的所有行。

于 2013-05-13T18:45:49.017 回答