题目:输入一个矩阵(行列相等的二维矩阵),按照从外向里以顺时针的顺序依次打印出每一个数字,以逗号隔开。
输入描述:二维数组对应字符串.[[1,2,3],[4,5,6],[7,8,9]]
输出描述:二维数组对应的一组数字.1,2,3,6,9,8,7,4,5
思路:螺旋访问数组是常见的一类题目,还可以变形为螺旋生成n维数组。这类题目思路都是相同的,主要是控制访问每行每列的边界。
考虑:用两个变量xnum,ynum分别对访问列方向、行方向上前进步数的限制。ynum初始值为列数, xnum初始值为行数-1。打印具体过程如下:
当行列方向可前进步数均不为0并且输出列表长度小于原矩阵元素个数时,循环以下四个方向:
→:行方向的打印,坐标y值步进,可前进步数为yum。
↓:列方向的打印,坐标x值步进,可前进步数为xnum。
走过半圈之后,ynum和xnum都减1,这是很显然的。
←:行方向的打印,坐标y值后退,为了保证与→ 方向数据不重合,需要加上xnum>=0的判断,这个判断的意思是上边界与下边界之间有间隔,因为如果此时只剩一行数据,那么意味着列方向可前进步数为0,即上一步的xnum = 0 - 1 = -1
↑:行方向的打印,坐标x值后退,为了保证与↓ 方向数据不重合,需要加上ynum>=0的判断,这个判断的意思是左边界与右边界之间有间隔,同上
实现代码一
# _*_ encoding:utf-8 _*_
import numpy as np
import pandas as pd
from numpy import *
def rotate(array):
temp = np.zeros_like(array.transpose()) #np.zeros_like构建一个与原矩阵维度一样的新矩阵,array.transpose()矩阵转置
for j in range(len(array)): #len(matrix) #矩阵行数
for i in range(len(array[0])): # len(matrix[0]) #矩阵列数
temp[i][j] = array[j][len(array[0])-i-1] #行列对换
return temp
if __name__ =='__main__':
input = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
b = rotate(input)
output =b.flatten()
print(input,)
print(",".join(str(result) for result in output)) #以逗号间隔输出
输出结果:
代码实现二
# _*_ encoding:utf-8 _*_
import numpy as np
import pandas as pd
from numpy import *
class Solution(object):
def printMatrix(self, matrix):
result = [] # 打印矩阵
while matrix:
result += matrix.pop(0) #移除矩阵中的第一个元素,并返回被移除的元素的值,也就是说返回的是矩阵第一个元素。
if matrix:
matrix = self.turn(matrix)
return result
def turn(self, matrix): # 逆时针旋转矩阵
row = len(matrix) #矩阵行数
col = len(matrix[0]) #矩阵列数
new_matrix = [] # 存放旋转后的矩阵
for i in range(col): # 行列调换
new_line = []
for j in range(row):
new_line.append(matrix[j][col-1-i])
new_matrix.append(new_line)
return new_matrix
if __name__ == '__main__':
# 测试代码
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
]
solution = Solution() #调用class Solution
result = solution.printMatrix(matrix)
print(result)
输出结果: