《剑指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 ... 
随机推荐
- R大
			知乎链接 https://www.zhihu.com/collection/114506870 
- Kotlin中与Java不同的地方 需要注意
			1. 在Kotlin中不会将基本数据类型的自动转型比如 scriptIntrinsicBlur.setRadius(25) //报错, 必须写成 25f 或者 调用.toFloat() 2.Kotli ... 
- Flask中Mysql数据库的常见操作
			from flask import Flask,render_template #导入第三方链接库sql点金术 from flask_sqlalchemy import SQLAlchemy #建立对 ... 
- Spring的jdbcTemplate操作-未完整
			1 spring框架一站式框架(1)针对javaee三层,每一层都有解决技术(2)在dao层,使用 jdbcTemplate 2 spring对不同的持久化层技术都进行封装 
- eclipse中一些常见svn图标的含义
			项目视图 The Package Explorer view - 已忽略版本控制的文件.可以通过Window → Preferences → Team → Ignored Resources.来忽 ... 
- awk基本用法
			1 简介 awk实质是一种编程语言,基本作用在于查找和替换. 2 基本用法 有文本名称为:awk.txt 内容为: john.wang male 30 021-111111 lucy.yang f ... 
- 2017-2018-2 20165237 实验三《 敏捷开发与XP实践》实验报告
			2017-2018-2 20165237 实验三< 敏捷开发与XP实践>实验报告 实验报告表头: 知识点: 1.XP团队使用现场客户.特殊计划方法和持续测试来提供快速的反馈和全面的交流: ... 
- Linux三剑客之awk命令
			awk简介 awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的首个字母.实际上 AWK 的确拥有自己的语言: AWK 程 ... 
- Netty源码学习笔记
			1.ByteBuf 
- 关于树的常见操作-C++面试
			#include <iostream> using namespace std; //树的存储结构与设计 struct BitNode { int data; BitNode* leftC ... 
