《剑指offer》---顺时针打印矩阵
本文算法使用python3实现
1. 问题1
1.1 题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.
输入矩阵为 $$ \begin{bmatrix} 1 & 2 & 3 & 4 \ 5 & 6 & 7 & 8 \ 9 & 10 & 11 & 12 \ 13 & 14 & 15 & 16 \ \end{bmatrix} $$
输出为1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10
时间限制:1s;空间限制:32768K
1.2 思路描述:
(1)将矩阵第一行加入result中,同时删除第一行。
(2)对剩余矩阵进行逆时针旋转90度,继续取其第一行
(3)直到矩阵被删除为空为止。
1.3 程序代码:
class Solution:
def printMatrix(self, matrix):
# 每次将矩阵第一行加入result列表
result = []
while matrix:
result += matrix.pop(0)
if not matrix :
break
matrix = self.turnMatrix(matrix)
return result
def turnMatrix(self, matrix):
# 对矩阵进行逆时针旋转90度操作
rows = len(matrix)
cols = len(matrix[0])
resMatrix = []
for j in range(cols):
temp = []
for i in range(rows):
temp.append(matrix[i][j])
resMatrix.append(temp)
resMatrix.reverse()
return resMatrix
2. 问题2
2.1 题目描述:
顺时针旋转填充数组。
输入为1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
输出矩阵为 $$ \begin{bmatrix} 1 & 2 & 3 & 4 \ 12 & 13 & 14 & 5 \ 11 & 16 & 15 & 6 \ 10 & 9 & 8 & 7 \ \end{bmatrix} $$
时间限制:1s;空间限制:32768K
2.2 思路描述:
(1)给一个 $ m \times n $ 的矩阵,和矩阵的开始坐标 $ x、y $,顺序填充该矩阵的最外围边缘。
(2)不断缩小矩阵的规模(每次高度和长度各减少2),直到 $ m $ 和 $ n $ 有一个为0,则说明该填充结束。
(3)当 $ m < n $ 时,最后一次剩余的不再是一个矩阵,而是一行,需要单独定义如何填充。
\]
(4)当 $ m > n $ 时,最后一次剩余的不再是一个矩阵,而是一列,同样也需要单独定义如何填充。
\]
2.3 程序代码:
class Solution():
def FillMatrix(self, m, n, count):
# 创建 m*n的列表
matrix = [[0]*n for i in range(m)]
x = 0; y = 0; cnt =1
while m>0 and n>0:
if m == 1:
for k in range(y, y+n):
matrix[x][k] = cnt
cnt += 1
break
if n == 1:
for k in range(x, x+m):
matrix[k][y] = cnt
cnt += 1
break
matrix, cnt = self.FillEdge(x, y, m, n, cnt, matrix)
x += 1
y += 1
m -= 2
n -= 2
return matrix
def FillEdge(self, x, y, m, n, cnt, matrix):
i = x; j = y
while j < y+n-1:
matrix[i][j] = cnt
j += 1
cnt += 1
while i < x+m-1:
matrix[i][j] = cnt
i += 1
cnt += 1
while j > y:
matrix[i][j] = cnt
j -= 1
cnt += 1
while i > x:
matrix[i][j] = cnt
i -= 1
cnt += 1
return matrix, cnt
《剑指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 ...
随机推荐
- 我的Tmux学习笔记
0. 修改指令前缀 // ~/.tmux.conf ubind C-b set -g prefix C-a 1. 新建会话 tmux tmux new -s session-name // 可以设置会 ...
- 记一次PHP实现接收邮件信息(我这里测试的腾讯企业邮件)
PHP实现接收邮件信息(我这里测试的腾讯企业邮件) , 其他的类型的没有测,应该只要更换pop3地址 端口号就可以. 代码如下(代码参考网络分享): <?php //此处查看链接状态 heade ...
- hive 学习系列六 hive 去重办法的思考
方法1,建立临时表,利用hive的collect_set 进行去重. create table if not exists tubutest ( name1 string, name2 string ...
- hive 查看表结构和属性
1.查看数据库/表 show databases/tables; 2.切换数据库 use database_name; 3.查看表结构 desc table_name; 4.查看表详细属性 desc ...
- 二、linux编译环境的搭建
1.linux编译工具安装 vim安装:apt-get install vim 注意:使用C语言源代码语法加亮功能,需要配置文件/etc/vim/vimrc,加入代码syntaxon.文件后缀必须为. ...
- 成都Uber优步司机奖励政策(3月8日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 14、Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...
- restTemplate访问接口
后端技术精选 每天推送精选技术好文,涉及Java.python.Linux及MySQL,欢迎关注微信公众号:后端技术精选 随笔 - 52, 文章 - 0, 评论 - 50, 引用 - 0 Spring ...
- protected修饰符详解
protected这个修饰符,各大参考书都会这样说:访问权限为类内,包内和子类,因此在父类中定义的方法和成员变量如果为protected修饰的,是可以在不同包中的子类进行访问的,示例代码如下: pac ...
- 逆波兰表达式[栈 C 语言 实现]
逆波兰表达式 逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示.波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示 ...