1260. Shift 2D Grid

QUESTION:

Given a 2D grid of size n * m and an integer k. You need to shift the grid k times.

In one shift operation:

Element at grid[i][j] becomes at grid[i][j + 1]. Element at grid[i][m - 1] becomes at grid[i + 1][0]. Element at grid[n - 1][m - 1] becomes at grid[0][0]. Return the 2D grid after applying shift operation k times.

Example 1:

Input: grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1 Output: [[9,1,2],[3,4,5],[6,7,8]] Example 2:

Input: grid = [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k = 4 Output: [[12,0,21,13],[3,8,1,9],[19,7,2,5],[4,6,11,10]] Example 3:

Input: grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9 Output: [[1,2,3],[4,5,6],[7,8,9]]

Constraints:

1 <= grid.length <= 50 1 <= grid[i].length <= 50 -1000 <= grid[i][j] <= 1000 0 <= k <= 100

EXPLANATION:

看到题目后,再审一下,发现需要返回的是一个list,那么就说明是可以改变数据结构的。首先想到的就是首尾相连的linkedlist,通过移动k位后,再重新进行填充。就依照这个思路。
逻辑:
1.首先将数组存放在链表中
2.计算开始的位置: index就为往前走k步。
|————–|————————-|
k 0 nm
这样就很清楚了,那么k的位置其实就是n
m-k的位置,然后向后开始计算就行。同时需要考虑k>nm的情况
3.按照index位置,作为0开始添加,当k>n
m的时候就预设为0重新添加 4.将添加的结果添加到集合中

SOLUTION:

class Solution {
    public List<List<Integer>> shiftGrid(int[][] grid, int k) {
                LinkedList<Integer> ll = new LinkedList<>();
        for(int i = 0;i<grid.length;i++){
            for(int j = 0;j<grid[i].length;j++){
                ll.add(grid[i][j]);
            }
        }
        List<List<Integer>> result = new ArrayList<>();
        int index = grid.length*grid[0].length-k < 0 ? grid.length*grid[0].length - k%(grid.length*grid[0].length) :grid.length*grid[0].length-k ;
        for(int i = 0;i<grid.length;i++){
            List<Integer> tmp = new ArrayList<>();
            for(int j = 0;j<grid[i].length;j++){
                if(index==grid.length*grid[i].length) index= 0;
                tmp.add(ll.get(index));
                index++;
            }
            result.add(tmp);
        }
        return result;
    }
}