《剑指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 = ; //一个矩阵跑的圈数
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》顺时针打印矩阵的更多相关文章
- 剑指offer - 顺时针打印矩阵 - JavaScript
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下 4 X 4 矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印 ...
- 剑指Offer 顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...
- 剑指OFFER——顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8 ...
- 剑指Offer顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...
- 剑指Offer_Java_顺时针打印矩阵(二维数组)
顺(逆)时针打印矩阵 算法思想: 简单来说,就是不断地收缩矩阵的边界 定义四个变量代表范围,up(初始0).down(初始-行高).left(初始-0).right(初始-列宽), 向右走存入整行的值 ...
- 剑指Offer-19.顺时针打印矩阵(C++/Java)
题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字 ...
- 剑指offer--26.顺时针打印矩阵
1,2,3,45,6,7,88,10,11,1213,14,15,16 每次输出第一行,然后删除第一行,逆时针旋转剩下的矩阵. ------------------------------------ ...
- python剑指offer 顺时针打印指针
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...
- 用js刷剑指offer(顺时针打印数组)
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...
- 剑指Offer18 顺时针打印矩阵
/************************************************************************* > File Name: 18_PrintM ...
随机推荐
- 「PKUWC 2018」Minimax
传送门:Here 一道线段树合并好题 如果要维护点$ x$的信息,相当于合并$ x$的两棵子树 对于这题显然有:任何叶子节点的权值都可能出现在其祖先上 因而我们只需要在线段树合并的时候维护概率即可 我 ...
- python 中的"*"与"**"
1.Python中 *和**很常见的运算符的用途及其多种使用方式. 本文所述的*和**,指的是*和**前缀运算符,而不是中缀运算符. 所以指的不是乘法和乘幂: 使用*和**将参数传递给函数 使用*和* ...
- mysql连接报java.math.BigInteger cannot be cast to java.lang.Long异常
使用hibernate出现以下错误 java.sql.SQLException: java.lang.ClassCastException: java.math.BigInteger cannot b ...
- 列式数据库~clickhouse问题汇总
一 简介:常见的clickhouse 问题汇总 二 问题系列 1 内存问题 Code: 241. DB::Exception: Received from localhost:9000, : ...
- MongpDB 学习手册 - 索引
//查看数据库以及容量 // show dbs //查看有哪些数据表 // show collections // MongoDB 索引 // 索引通常能够极大的提高查询的效率,如果没有索引,Mong ...
- openstack Q版部署-----glance安装配置(4)
镜像服务(glance)使用户能够发现,注册和检索虚拟机镜像. 它提供了一个REST API,使您可以查询虚拟机镜像元数据并检索实际镜像. 您可以将通过镜像服务提供的虚拟机映像存储在各种位置,从简单的 ...
- JS调用函数时候加括号与只写函数名字的区别 fn与fn()的区别
经常见插件里面函数调用的时候只写个函数名字,不写函数参数,甚至连括号也不写,比如说: <!DOCTYPE html> <html> <head> <meta ...
- Elasticsearch 5.4.3实战--环境搭建
1. 选择搭建的服务器信息 $ uname -a Linux SA0124 2.6.32-642.11.1.el6.x86_64 #1 SMP Fri Nov 18 19:25:05 UTC 2016 ...
- MySQL数据库的锁详解【转】
当然在我们的数据库中也有锁用来控制资源的并发访问,这也是数据库和文件系统的区别之一. 为什么要懂数据库锁? 通常来说对于一般的开发人员,在使用数据库的时候一般懂点 DQL(select),DML(in ...
- ES6学习笔记三
1.Symbol ES5 的对象属性名都是字符串,这容易造成属性名的冲突.如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突.这就是 ES6 引入Symbol的原因 ...