顺时针转圈打印数组

所谓顺时针转圈打印数字,即从外往内打印数组,一圈一圈地打印,这是剑指offer的第20题。

这个题的思路是这样的:

首先,打印的条件是rows>2*start and cols>2*start,然后把打印一圈分为四步

  1. 首先从左到右打印一行,这一步是任意情况都要执行的,即使只有11列;
  2. 然后从上到下打印一列,这一步的条件是至少有两行;
  3. 再执行从右到左打印一行,这一步的条件是至少有两行两列,因为若只有两行一列,那么在第2步就打印完成了;
  4. 最后执行从下到上打印一列,这一步的条件是至少有三行两列。

现在问题转化为如何具体化上述每一步的执行条件和打印的范围,首先需要明确的是打印的起始坐标是横纵相等的,设其为start,则横方向上打印的最大坐标为endX = cols - 1 - start,列方向上打印的最大坐标为endY = rows - 1 - start,现在确定每一步的条件和打印范围。

  1. 无条件,打印坐标为matrix[start][i],i的范围为[start,endX]
  2. 条件为:endY>start,打印坐标为matrix[i][endX]i的范围为[start+1,endY]
  3. 条件为:endY>start and endX>start,打印坐标为matrix[endY][i],i的范围为[endX-1,start];(注意这里是反向的)
  4. 条件为:endY>start+1 and endX>start ,打印坐标为matrix[i][start],i的范围为[endY-1,start+1];(注意这里是反向的)

即打印方式为:

在这里插入图片描述

代码:

def printMatrix(matrix):
    rows = len(matrix)
    if rows<1:
        print('[]')
    cols = len(matrix[0])
    start = 0
    while rows > 2 * start and cols > 2 * start:
        endX = cols - 1 - start
        endY = rows - 1 - start
        # 第一步,从左到右打印一行
        for i in range(start,endX+1):
            print(matrix[start][i])
        # 第二步,从上到下打印一列
        # 要求至少有两行
        if endY > start: 
            for i in range(start+1,endY+1):
                print(matrix[i][endX])
        # 第三步,从右到左打印一行
        # 要求至少有两行两列
        if endY > start and endX > start:
            for i in reversed(range(start,endX)):
                print(matrix[endY][i])
        # 第四步,从下到上打印一列
        # 要求至少有三行两列
        if endY > start + 1 and endX > start:
            for i in reversed(range(start+1,endY)):
                print(matrix[i][start])
        start += 1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值