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

    本题来自《剑指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.

    思路:

       思考两个问题,分两步走:

      第一步:总结,一个矩阵总共要走几圈?条件是行和列要大于圈数的2倍。

      第二步:每一圈该怎么遍历?外圈是先第一行,最后一列,最后一行,第一列的方式进行遍历。

    C++ Code:

    class Solution {
    public:
        vector<int> printMatrix(vector<vector<int> > matrix) {
                                                            //加入输入为空,处理
            int start = 0;                                  //一个矩阵跑的圈数
            int row = matrix.size();                        //矩阵行数
            int col = matrix[0].size();                     //矩阵列数
            vector<int> result;                             //存放结果值
            while (row>start*2 && col>start*2){             //循环圈数
                result = dealData(matrix,start,result);     //每一圈的处理代码
                start++;
            }
            return result;
        }
        vector<int> dealData(vector<vector<int>> matrix,int start,vector<int> result){
            int endX = matrix[0].size()-start -1;           //X轴为横坐标,即为矩阵的列数
            int endY = matrix.size()-start-1;               //Y轴为竖坐标,即为矩阵的行数
            for (int i=start;i<=endX;i++){                  //处理第一行,从左往右,从[start,endX]
                result.push_back(matrix[start][i]);
            }
            if (endY>start){                                //前提是处理的start没有越过最后一行
                for (int i=start+1;i<=endY;i++){            //处理最后一列,从上到下,从[start+1,endY]
                    result.push_back(matrix[i][endX]);
                }
            }
            if (start<endX && start<endY){                  //前提是start没有越界(行和列)
                for (int i=endX-1;i>=start;i--){            //处理最后一行,从右往左,[endX,start]递减
                    result.push_back(matrix[endY][i]);
                }
            }
            if (start<endX && start<endY-1){                //边界条件是start依然小于行列两个边界
                for (int i=endY-1;i>=start+1;i--){          //处理第一列,从下往上,[endY-1,start+1]递减
                    result.push_back(matrix[i][start]);
                }
            }
            return result;                                  //将得到的值返回
        }
    };

    Python Code:

    # -*- coding:utf-8 -*-
    class Solution:
        # matrix类型为二维列表,需要返回列表
        def printMatrix(self, matrix):
            # write code here
            if not matrix:                                #边界,输入为空要处理
                return None
            row = len(matrix)                             #
            col = len(matrix[0])                          #
            start = 0                                     #圈数
            result = []                                   #结果存放容器
            while row>start*2 and col>start*2:            #圈数的循环条件,行和列要大于行列的2倍
                resut = self.dealData(matrix,start,result)#调用处理每一圈
                start += 1                                #圈数递增
            return result
        def dealData(self,matrix,start,result):
            endX = len(matrix[0])-start-1                 #X坐标,最后一列
            endY = len(matrix)-start-1                    #Y坐标,最后一行
            for i in range(start,endX+1):                 #处理第一行
                result.append(matrix[start][i])
            if (start<endY):
                for i in range(start+1,endY+1):           #处理最后一列
                    result.append(matrix[i][endX])
            if start<endX and start<endY:
                for i in range(endX-1,start-1,-1):        #处理最后一行
                    result.append(matrix[endY][i])
            if start<endX and start<endY-1:
                for i in range(endY-1,start,-1):          #处理第一列
                    result.append(matrix[i][start])
            return result
  • 相关阅读:
    Linux文档中翻页和搜索关键字
    windows安装mysql
    生成二维码和解析二维码
    powerdesigner通过er图生成mysql执行文件
    powerdesigner使用遇到的一些问题
    UnsupportedOperationException异常
    String[]和List的区别及相互转换
    @PostConstruct注解原理解析
    git强制更新并覆盖本地修改
    Dubbo架构与底层实现
  • 原文地址:https://www.cnblogs.com/missidiot/p/10783603.html
Copyright © 2011-2022 走看看