本题来自《剑指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 = ; //一个矩阵跑的圈数
int row = matrix.size(); //矩阵行数
int col = matrix[].size(); //矩阵列数
vector<int> result; //存放结果值
while (row>start* && col>start*){ //循环圈数
result = dealData(matrix,start,result); //每一圈的处理代码
start++;
}
return result;
}
vector<int> dealData(vector<vector<int>> matrix,int start,vector<int> result){
int endX = matrix[].size()-start -; //X轴为横坐标,即为矩阵的列数
int endY = matrix.size()-start-; //Y轴为竖坐标,即为矩阵的行数
for (int i=start;i<=endX;i++){ //处理第一行,从左往右,从[start,endX]
result.push_back(matrix[start][i]);
}
if (endY>start){ //前提是处理的start没有越过最后一行
for (int i=start+;i<=endY;i++){ //处理最后一列,从上到下,从[start+1,endY]
result.push_back(matrix[i][endX]);
}
}
if (start<endX && start<endY){ //前提是start没有越界(行和列)
for (int i=endX-;i>=start;i--){ //处理最后一行,从右往左,[endX,start]递减
result.push_back(matrix[endY][i]);
}
}
if (start<endX && start<endY-){ //边界条件是start依然小于行列两个边界
for (int i=endY-;i>=start+;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

《剑指offer》顺时针打印矩阵的更多相关文章

  1. 剑指offer - 顺时针打印矩阵 - JavaScript

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

  2. 剑指Offer 顺时针打印矩阵

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

  3. 剑指OFFER——顺时针打印矩阵

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

  4. 剑指Offer顺时针打印矩阵

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

  5. 剑指Offer_Java_顺时针打印矩阵(二维数组)

    顺(逆)时针打印矩阵 算法思想: 简单来说,就是不断地收缩矩阵的边界 定义四个变量代表范围,up(初始0).down(初始-行高).left(初始-0).right(初始-列宽), 向右走存入整行的值 ...

  6. 剑指Offer-19.顺时针打印矩阵(C++/Java)

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

  7. 剑指offer--26.顺时针打印矩阵

    1,2,3,45,6,7,88,10,11,1213,14,15,16 每次输出第一行,然后删除第一行,逆时针旋转剩下的矩阵. ------------------------------------ ...

  8. python剑指offer 顺时针打印指针

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

  9. 用js刷剑指offer(顺时针打印数组)

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

  10. 剑指Offer18 顺时针打印矩阵

    /************************************************************************* > File Name: 18_PrintM ...

随机推荐

  1. day 3 - 2 数据类型练习

    1.有变量 name = " aleX leNB " 完成如下操作 name = " aleX leNB " # 1) 移除两端空格n1 = name.stri ...

  2. Django REST framework 第七章 Schemas & client libraries

    模式是一个机器可读文档,描述可用的API端点,URL以及它们支持的操作. 模式对于自动生成文档是一个很有用的工具,也可以用来动态调用可以于API交互的客户端库. Core API 为了提供模式支持,R ...

  3. 微服务之Spring cloud

    微服务 Spring cloud Spring Cloud provides tools for developers to quickly build some of the common patt ...

  4. Flask三种导入配置文件的方式

    # 配置对象,里面定义需要给 APP 添加的一系列配置 class Config(object): DEBUG = True # 从配置对象中加载配置 app.config.from_object(C ...

  5. pwnable.kr col

    collision - 3 pt 连接上查看col.c源码 分析一下代码, 1.hashcode等于一个固定的值 2.check_password函数取输入数据,4个一组,将输入的字符转成int,然后 ...

  6. linux中如何使用终端裁剪图片?

    1,首先要安装支持图片裁剪的包: sudo apt-get install imagemagick 需要的话可以update一下, 2,在图片所在位置打开终端,我的我的截图叫screenshot.pn ...

  7. CentOS7.4安装部署KVM虚拟机

    命令:virt-manager 可以查看已经安装的虚拟机 参考文档:1.https://blog.csdn.net/qq_39452428/article/details/80781403

  8. Java HashMap工作原理及实现[转]

    原文:http://yikun.github.io/2015/04/01/Java-HashMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE ...

  9. 关于Vue的两层for循环

    vue的核心功能是for循环,双层for循环的场景也是比较常见. <script type="text/javascript"> var vm = new Vue({ ...

  10. 数字图像处理的Matlab实现(2)—MATLAB基础

    第2章 MATLAB编程基础 2.1 M-文件 MATLAB中的M-文件可以是简单执行一系列MATLAB语句的源文件,也可以是接收自变量并产生一个或多个输出的函数. M-文件由文本编辑器创建,并以fi ...