public class Solution1260 { public List> shiftGrid(int[][] grid, int k) { // 行数 int m = grid.length; // 列数 int n = grid[0].length; // 偏移值,取下模 k = k % (m * n); // 反向取下数量,因为我打算直接从头填充新的矩阵 /* * 比如 * 1 2 3 * 4 5 6 * 7 8 9 * 需要变成 * 9 1 2 * 3 4 5 * 6 7 8 * 就要从 9 开始填充 */ int reverseK = m * n - k; List> matrix = new ArrayList<>(); // 这类就是两层循环 for (int i = 0; i < m; i++) { List line = new ArrayList<>(); for (int j = 0; j < n; j++) { // 数量会随着循环迭代增长, 确认是第几个 int currentNum = reverseK + i * n + (j + 1); // 这里处理下到达矩阵末尾后减掉 m * n if (currentNum > m * n) { currentNum -= m * n; } // 根据矩阵列数 n 算出在原来矩阵的位置 int last = (currentNum - 1) % n; int passLine = (currentNum - 1) / n; line.add(grid[passLine][last]); } matrix.add(line); } return matrix; } }