【问题标题】:Shifting a 2D array to the left loop将二维数组移动到左循环
【发布时间】:2023-03-22 00:26:01
【问题描述】:

我有一个包含值的二维数组。示例如下:

010101 101010 010101

我想创建一个循环,将这些值向左移动,如下例所示。

101010 010101 101010

所以“脱落”的元素会回到最后。我很难用代码解决这个问题。

有人有什么建议吗?

到目前为止,我已经让它滚动了,但我不知道如何让脱落的元素重新进入。

这是我目前所拥有的。

for (int row = 0; row < array.length; row++) {
    for (int col = 0; col < array[row].length; col++) {
        if (!(row >= array.length) && !(col >= array[row].length - 1)) {
            array[row][col] = array[row][col + 1];
        }
    }
}

【问题讨论】:

  • 如果您不必使用数组,则可以使用 LinkedList 并删除第一个节点并将其添加到末尾。

标签: java sorting multidimensional-array


【解决方案1】:

尝试使用模运算符:

arrayShifted[row][col] = array[row][(col + 1) % array[row].length];

同时删除您的条件检查。另请注意,为避免覆盖值,您需要将结果存储在新数组中。

for (int row = 0; row < array.length; row++) {
    for (int col = 0; col < array[row].length; col++) {
        arrayShifted[row][col] = array[row][(col + 1) % array[row].length]
    }
}

【讨论】:

  • 我尝试了你的建议,但它并没有把“脱落”的元素放回去。我只是按照上面的例子做的。
  • 谢谢!效果很好。现在我必须破译这个算法到底做了什么:p 干杯!
  • @kunruh 是的,它需要放入一个新数组中。
  • 哎呀,当我看到他说它有效时删除了我的评论。以为我追错了逻辑!那行得通。
【解决方案2】:

这是一个完整的方法,它采用可变数量的点来移动每一行,并正确处理复制与模数方法中相同的元素。

public void shiftArray(int[][] array, int shift) {

    for (int row = 0; row < array.length; row++) {
        int rowLength = array[row].length;

        // keep shift within bounds of the array
        shift = shift % rowLength;

        // copy out elements that will "fall off"
        int[] tmp = new int[shift];
        for (int i = 0; i < shift; i++) {
            tmp[i] = array[row][i];
        }

        // shift like normal
        for (int col = 0; col < rowLength - shift; col++) {
            array[row][col] = array[row][col + shift];
        }

        // copy back the "fallen off" elements
        for (int i = 0; i < shift; i++) {
            array[row][i + (rowLength - shift)] = tmp[i];
        }
    }
}

试运行

int[][] array = new int[][] {
    {0,1,0,1,0,1},
    {1,0,1,0,1,0},
    {0,1,0,1,0,1}
};

shiftArray(array, 1);

for (int[] row : array) {
    for (int col : row) {
        System.out.print(col);
    }
    System.out.println();
}

// 101010
// 010101
// 101010

【讨论】:

    猜你喜欢
    • 2022-06-11
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多