题目名称

给你一个 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 次迁移操作后最终得到的 二维网格。

示例

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

输出:[[9,1,2],[3,4,5],[6,7,8]]

题解

暴力计算法

这道题相对来说较为简单,从示例可以看出,所谓的移动k个元素,其实就是二维网格内的所有元素同步的移动k个元素,然后和二维数组内元素的总长度求余,所得余数便是二维网格内元素的位置

所以首先最重要的就是将二维网格平铺成为一个一维数组,可以使用数组的 flat 方法,当前也可以使用递归的方式来遍历出二维数组中的所有元素。

将二维数组平铺之后,然后根据传入的k值得出需要平移的元素个数,然后将不需要移动的元素和移动之后的元素拼接成一个新的数组,最后在根据原二维数组的长度得出新的二维数组

答案

1
2
3
4
5
6
7
8
9
10
    var shiftGrid = function(grid, k) {
let arr = grid.flat(Infinity)
let index = arr.length - k % arr.length
let newArr = arr.slice(index).concat(arr.slice(0, index))
let length = grid[0].length, ngrid = []
for(let i = 0; i < newArr.length; i += length) {
ngrid.push(newArr.slice(i, i + length))
}
return ngrid
};