class Solution: # matrix类型为二维列表,需要返回列表 def printMatrix(self, matrix): # write code here result = [] while(matrix): result+=matrix.pop(0) if not matrix or not matrix[0]: break matrix = self.turn(matrix) return result def turn(self,matrix): num_r = len(matrix) num_c = len(matrix[0]) newmat = [] for i in range(num_c): newmat2 = [] for j in range(num_r): newmat2.append(matrix[j][i]) newmat.append(newmat2) newmat.reverse() return newmat
新:可以模拟魔方逆时针旋转的方法,一直做取出第一行的操作
例如
1 2 3
4 5 6
7 8 9
输出并删除第一行后,再进行一次逆时针旋转,就变成:
6 9
5 8
4 7
常规操作:设置上下左右四个指针,按圈数来打印。偶数行矩阵可以通过。奇数行矩阵会剩中间一个不打印,why
arr = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25]] left = 0 top = 0 right = len(arr[0])-1 bottom = len(arr)-1 res = [] while left <= right and top <= bottom: i = left j = top k = right t = bottom while i < right: # 第一行取到right之前 res.append(arr[top][i]) i += 1 # 第一行最后一个不取 while j < bottom: # 最右边的一列取到bottom之上 res.append(arr[j][right]) j += 1 while k > left: # 最下面一行 取到left之前 res.append(arr[bottom][k]) k -= 1 while t > top: # 最左边一列 取到top之下 res.append(arr[t][left]) t -= 1 left += 1 top += 1 right -= 1 bottom -= 1 print(res)
之字形打印二维数组:
重点是如何打印出二维数组的左右、上下半角。设置转向标记控制打印方向。
# arr = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] arr = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25]] n = len(arr) res = [] flag = 1 # 转向标记 for x in range(n): # 打印左上半角 i = 0 while i <= x: if flag == 1: res.append(arr[i][x-i]) else: res.append(arr[x-i][i]) i += 1 flag = -flag """ for i in range(n): # 打印数组左上半角 for j in range(i+1): if flag == 1: res.append(arr[j][i-j]) else: res.append(arr[i-j][j]) flag = -flag""" for x in range(n, 2*n-1): # 右下半角 i = n-1 while i <= n and x-i < n: # 第i行第x-i个 if flag == -1: res.append(arr[i][x-i]) else: res.append(arr[x-i][i]) i -= 1 flag = -flag print(res)