携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- m == grid.length
- n == grid[i].length
- 1 <= m <= 50
- 1 <= n <= 50
- 1000 <= grid[i][j] <= 1000
- 0 <= k <= 100
二、思路分析:
我们拿到本题,读取题意要求我们对二维的网络格按照一定规律进行移动,输出移动后的二维数组。二维网格中每一个元素都是怎么移动的呢?,我们继续对题目内容审题:
- 每行网格grid[i][j]按照grid[i][j + 1]
- 每行网格grid[i]最后一个元素移动到下一行的第一个grid[i+1][0]
- 最后一行最后一列grid[n-1][m-1]的元素移动到第一行第一列第一个位置上grid[0][0]
看完规则,总结一下每一次二维网格的移动是按照倒Z形的形状移动的,例如示列1如图:
因此,解答本题我们直接使用模拟网格迁移规律来进行迁移,思路大致如下:
- 每一次迁移的次数是有K参数决定的,当K=0时,则直接返回原网格grid
- 使用for循环取出grid中每一层的内容g
- 再使用一个for循环从n-1开始从右到左往前替换,g[j],g[j-1]=g[j-1],g[j]
- 然后再使用一个for循环对每一行grid[i][0]从下m-1到上进行替换g[i][0],g[i-1][0]= g[i-1][0] = g[i-1][0],g[i][0]
我们再使用示列1进行替换演示,如图所示:
根据以上思路,我们使用Python代码进行实现如下:
class Solution(object):
def shiftGrid(self, grid, k):
"""
:type grid: List[List[int]]
:type k: int
:rtype: List[List[int]]
"""
m = len(grid)
n = len(grid[0])
if k == 0: return grid
def change(grid):
for i,g in enumerate(grid):
for j in range(n-1,0,-1):
g[j],g[j-1] = g[j-1],g[j]
for i in range(m-1,-0,-1):
grid[i][0],grid[i-1][0] = grid[i-1][0],grid[i][0]
return grid
for i in range(k):
ans = change(grid)
return ans
其实,我们可以观察二维网格元素移动,可以推出一定规律:
- 我们可以对二维网格元素转换成一维网格,它们坐标下标:index = i*n+j
- 当迁移K次后,元素坐标移动是index1 = (index+k)mod(m*n)
class Solution(object):
def shiftGrid(self, grid, k):
"""
:type grid: List[List[int]]
:type k: int
:rtype: List[List[int]]
"""
m = len(grid)
n = len(grid[0])
ans = [[0]*n for _ in range(m)]
for i, row in enumerate(grid):
for j ,r in enumerate(row):
index1 = (i * n + j + k) % (m * n)
ans[index1 // n][ index1 % n] = r
return ans
三、总结:
本题考察二维数组元素移动,解答本题的技巧可以将其元素转换成一维数组,AC提交记录如下:
- 时间复杂度:O(mn),mn个元素遍历
- 空间复杂度:O(1)
以上是本期内容,欢迎大佬们点赞评论,下期见~~