python顺时针螺旋矩阵_算法基础面试题之逆时针遍历二维数组(螺旋矩阵)

本文介绍了如何解决面试中遇到的一道算法题——将二维数组逆时针存入一维数组。通过矩阵转置和递归处理子问题,给出了使用Python和Numpy实现的解题代码,强调了编程基础和代码规范的重要性。
摘要由CSDN通过智能技术生成

考题:如何把一个二维数组逆时针的存到一个一维数组里面

笔者在面试的时候遇到了一道题,面试官让我用熟悉的语言把一个二维数组逆时针的存到一个一维数组里面去。很遗憾当时没有做出来(残念,大家也知道如果算法面试的时候,如果编程题没做出来,基本凉凉),事后发现这道题其实很简单...所以笔者在此把自己的解题思路分享给大家,同时也以此为戒,来时时告诉自己编程基础的重要性。二维数组的逆时针遍历

神奇的是面试官当时居然提示我应该用规则来解这道题,但是我第一时间想到的是利用矩阵的转置。因为逆时针遍历上面这个数组相当于顺时针遍历下面这个数组↓:二维数组的正时针遍历

大家知道一个二维的数组其实就是一个矩阵,而上面这个过程恰好符合矩阵的转置运算,我们来回顾一下矩阵的转置:设A为m×n阶矩阵(即m行n列),第i 行j 列的元素是a(i,j),

即:把m×n矩阵A的行换成同序数的列得到一个n×m矩阵,此矩阵叫做A的转置矩阵。

我们拿到原始矩阵的转置后,我们可以观察到这个新的矩阵的第一行就是我们想要结果的前n个元素,那么这个矩阵可以被分解成2个部分,如下图所示,上半部分是我们想要答案的部分结果,下半部分则还需要进一步的被处理:矩阵分解的过程

实际上这种操作在Python就是很简单的切片、分片与索引的操作,我们先来回顾一下numpy的切片与引索:ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,

逆时针输出n×n螺旋矩阵是一个经典的编程问题,它涉及到了数组操作、递归以及矩阵的动态构建。以下是生成一个逆时针螺旋矩阵的简单算法步骤: 1. 初始化一个空的二维数组,大小为n×n。 2. 定义四个变量:top(顶部索引),bottom(底部索引),left(左侧索引),right(右侧索引),它们分别表示当前的边界。 3. 首先,从左上角(top, left)开始,将数字填充到矩阵中,然后依次向右、向下、向右上和向左上移动,直到到达右下角(bottom, right)。 4. 当到达右下角后,逐层反转方向:左上->上->右->右下->左。每一步都减少相应的的跨度,同时更新对应的边界值。 5. 重复以上过程,直到所有的数字都填入矩阵。 下面是一个简单的Python示例: ```python def spiral(n): matrix = [[0] * n for _ in range(n)] top, bottom, left, right = 0, n - 1, 0, n - 1 direction = [(0, 1), (1, 0), (0, -1), (-1, 0)] # 右上, 右下, 左下, 左上 while True: for dy, dx in direction: for i in range(left, right + 1): matrix[top][i] = i + top * n top += dy if top < bottom and left < right: for i in range(top + 1, bottom): matrix[i][right] = i + right * n right -= dx elif top < bottom: break else: continue if left < right: for i in range(right - 1, left - 1, -1): matrix[bottom][i] = i + bottom * n bottom -= dy if top < bottom: break for i in range(bottom - 1, top, -1): matrix[i][left] = i + left * n left += dx if left >= right: break return matrix # 示例 print(spiral(3)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值