题目:
给你一个 n 行 m 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。
每次「迁移」操作将会引发下述活动:
位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。
位于 grid[i][m - 1] 的元素将会移动到 grid[i + 1][0]。
位于 grid[n - 1][m - 1] 的元素将会移动到 grid[0][0]。
请你返回 k 次迁移操作后最终得到的 二维网格。
示例 2:
输入:grid = [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k = 4
输出:[[12,0,21,13],[3,8,1,9],[19,7,2,5],[4,6,11,10]]
示例 3:
输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9
输出:[[1,2,3],[4,5,6],[7,8,9]]
源码:
class Solution {
public List<List<Integer>> shiftGrid(int[][] grid, int k) {
// 用一个数组来保存迁移后的结果
int[] res = new int[grid[0].length * grid.length];
List<List<Integer>> list = new ArrayList<>();
int x = grid.length;
int y = grid[0].length;
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
// 利用 k % 数组长度就为迁移后的位置来保存元素
k = k % res.length;
res[k++] = grid[i][j];
}
}
k = 0; // 需要将 k 重置为 0,方便后面添加进 List
for (int i = 0; i < x; i++) {
List<Integer> list2 = new ArrayList<>();
for (int j = 0; j < y; j++) {
list2.add(res[k++]);
}
// 添加完一行后加入二维的数组中
list.add(list2);
}
return list;
}
}