zoukankan      html  css  js  c++  java
  • 剑指offer-顺时针打印矩阵

    顺时针打印矩阵

    一、问题描述

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

    二、算法思路

    对于这样一个矩阵,顺时针进行打印有一定的规律,可以将矩阵看成是由很多个不同大小的甜甜圈构成。
    先打印最外侧的甜甜圈,然后打印第二层的,逐次往内。

    三、算法实现

    3.1、Python实现版

    # -*- coding:utf-8 -*-
    class Solution:
        # matrix类型为二维列表,需要返回列表
        def printMatrix(self, matrix):
            # write code here
            # 最外面的一圈
            res = []
            # row是列表的最大行下标
            row = len(matrix) - 1
            # col是列表的最大列下标
            col = len(matrix[0]) - 1
            # i是初始行,j是初始列
            i = 0
            j = 0
            while i <= row and j <= col:  # 每次循环都顺时针打印最外面的一圈
                res += matrix[i][j:col + 1]  # 把外圈的第一行打印
                print('1:'+str(matrix[i][j:col + 1]))
                if i+1<row:
                    temp=[m[col] for m in matrix][i+1:row]
                    print('2:' + str(temp))
                    res += temp
                if i!=row:
                    if j==0:
                        res += matrix[row][col::-1]
                        print("3:"+str(matrix[row][col::-1]))
                    else:  # i>0
                        res += matrix[row][col:j-1:-1]
                if j!=col:
                    if row-1>i:
                        temp=[m[j] for m in matrix][row-1:i:-1]
                        res += temp
                        print("4:"+str(temp))
                # 改变下标
                i = i + 1
                j = j + 1
                col = col - 1
                row = row - 1
                pass
            return res
    

    3.2、大佬的Python代码

        def printMatrix(self, matrix):
            res = []
            while matrix:
                res += matrix.pop(0)
                if matrix and matrix[0]:
                    for row in matrix:
                        res.append(row.pop())
                if matrix:
                    res += matrix.pop()[::-1]
                if matrix and matrix[0]:
                    for row in matrix[::-1]:
                        res.append(row.pop(0))
            return res
    
    keep going
  • 相关阅读:
    js 格式化时间
    js filter过滤数据
    vant 省市区三级联动 自定义json数据展示 取值
    移动端 table横向滚动
    js 判断字符串中是否包含某个字符串
    element ui form表单 刚进页面就验证
    js ES6 Promise.all 等两个接口都返回成功执行
    SDNU 1139.Emergency(起点更改最短路问题)
    SDNU 1062.Fibonacci(矩阵快速幂)
    SDNU 1103.买彩票(水题)
  • 原文地址:https://www.cnblogs.com/MarkKobs-blog/p/10425505.html
Copyright © 2011-2022 走看看