给你一个 m 行 n 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。
每次「迁移」操作将会引发下述活动:
位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。
位于 grid[i][n - 1] 的元素将会移动到 grid[i + 1][0]。
位于 grid[m - 1][n - 1] 的元素将会移动到 grid[0][0]。
请你返回 k 次迁移操作后最终得到的 二维网格。
示例 1:
输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1
输出:[[9,1,2],[3,4,5],[6,7,8]]
public List<List<Integer>> shiftGrid(int[][] grid, int k) {
for (; k > 0; k--) {
// 先创建一个新的二维数组
int[][] arr = new int[grid.length][grid[0].length];
// 移动除了最后一列的其他元素
for (int row = 0; row < grid.length; row++) {
for (int col = 0; col < grid[0].length - 1; col++) {
// 把当前值给下一个值
arr[row][col + 1] = grid[row][col];
}
}
// 移动最后一列元素(但不是最后一行最后一列元素)
for (int row = 0; row < grid.length - 1; row++) {
// 把每行最后一列的值给下一行的第一列元素
arr[row + 1][0] = grid[row][grid[0].length - 1];
}
// 移动最后一行最后一个元素, 给(0, 0)
arr[0][0] = grid[grid.length - 1][grid[0].length - 1];
// 把 arr 给 grid
grid = arr;
}
// 创建一个新的 List, 存 grid 的值, 以供返回
List<List<Integer>> list = new ArrayList<>();
for (int[] row : grid) {
List<Integer> listRow = new ArrayList<>();
list.add(listRow);
for (int v : row) listRow.add(v);
}
return list;
}