本题来自《剑指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. python - 字符编码/格式化/替换符

  2. 【转载分享】 JLINKv9在迅为iTOP-4412精英板上的应用

    本文转自:https://www.amobbs.com/thread-5680586-1-1.html 很多人买迅为iTop4412精英板,在Android或Linux+Qt跑起来后学习开发调试应用程 ...

  3. 贝叶斯优化(Bayesian Optimization)深入理解

    目前在研究Automated Machine Learning,其中有一个子领域是实现网络超参数自动化搜索,而常见的搜索方法有Grid Search.Random Search以及贝叶斯优化搜索.前两 ...

  4. pythonのscrapy抓取网站数据

    (1)安装Scrapy环境 步骤请参考:https://blog.csdn.net/c406495762/article/details/60156205 需要注意的是,安装的时候需要根据自己的pyt ...

  5. EditText设置可以点击,但是不可以编辑

    EditText设置  editText.setEnabled(false);后不可编辑也不可点击 设置  setFocusable(false)后不可编辑,但是再设置 setFocusable(tr ...

  6. C/S 开发框架 ----- 广州本地

    C/S 开发框架 -----  广州本地: 1) 爱奇迪    http://www.iqidi.com       发现一个源码出售站   http://www.51aspx.com/code/co ...

  7. Python3学习笔记32-xlwt模块

    xlwt模块是用来写入excel的第三方模块,需要下载安装后才能使用. 设置字体样式 import xlwt #初始化一个excel excel = xlwt.Workbook(encoding='u ...

  8. WCF之endpoint的binding属性

    最近在回顾之前做的wcf项目时,发现这个binding的属性有BasicHttpBinding,WSHttpBinding,webHttpBinding等几种方式.但是其中的区别当时未深入研究.现在网 ...

  9. http 遇到中文表单 转码

    #include <string> #include <vector> inline BYTE toHex(const BYTE x) { return x>9?x+55 ...

  10. ffmpeg-201701[10,16,21,23,25]-bin.7z

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...