一、前言
本系列文章为《剑指Offer》刷题笔记。
刷题平台:牛客网
书籍下载:共享资源
二、题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
则依次打印出数组:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。
1、思路
将结果存入vector数组,从左到右,再从上到下,再从右到左,最后从下到上遍历。
2、代码
C++:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 | class Solution { public: vector<int> printMatrix(vector<vector<int> > matrix) { int rows = matrix.size(); //行数 int cols = matrix[0].size(); //列数 vector<int> result; if(rows == 0 && cols == 0){ return result; } int left = 0, right = cols - 1, top = 0, bottom = rows - 1; while(left <= right && top <= bottom){ //从左到右 for(int i = left; i <= right; ++i){ result.push_back(matrix[top][i]); } //从上到下 for(int i = top + 1; i <= bottom; ++i){ result.push_back(matrix[i][right]); } //从右到左 if(top != bottom){ for(int i = right - 1; i >= left; --i){ result.push_back(matrix[bottom][i]); } } //从下到上 if(left != right){ for(int i = bottom - 1; i > top; --i){ result.push_back(matrix[i][left]); } } left++, top++, right--, bottom--; } return result; } }; |
Python2.7:
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 26 27 | # -*- coding:utf-8 -*- class Solution: # matrix类型为二维列表,需要返回列表 def printMatrix(self, matrix): # write code here rows = len(matrix) cols = len(matrix[0]) result = [] if rows == 0 and cols == 0: return result left, right, top, buttom = 0, cols - 1, 0, rows - 1 while left <= right and top <= buttom: for i in range(left, right+1): result.append(matrix[top][i]) for i in range(top+1, buttom+1): result.append(matrix[i][right]) if top != buttom: for i in range(left, right)[::-1]: result.append(matrix[buttom][i]) if left != right: for i in range(top+1, buttom)[::-1]: result.append(matrix[i][left]) left += 1 top += 1 right -= 1 buttom -= 1 return result |
题目变型:
给定一个数字2,打印矩阵:
给定一个数字3,打印矩阵:
给定一个数字4,打印矩阵:
Python:
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 26 27 28 29 30 31 | # -*- coding:utf-8 -*- def matrix(target): num = target * target left, right, top, bottom = 0, target-1, 0, target-1 res = [ [0 for col in range(target)] for row in range(target)] each = 1 while left <= right and top <= bottom and each <= num: for i in range(left, right+1): res[top][i] = each each += 1 for i in range(top+1, bottom+1): res[i][right] = each each += 1 if top != bottom: for i in range(left, right)[::-1]: res[bottom][i] = each each += 1 if left != right and each <= num: for i in range(top+1, bottom)[::-1]: res[i][left] = each each += 1 top += 1 left += 1 bottom -= 1 right -= 1 for i in range(len(res)): print("\t".join('%s' %id for id in res[i])) if __name__ == '__main__': matrix(4) |
微信公众号
分享技术,乐享生活:微信公众号搜索「JackCui-AI」关注一个在互联网摸爬滚打的潜行者。
2019年3月16日 下午5:15 沙发
我觉得这样还不错hhhh
class Solution:
# matrix类型为二维列表,需要返回列表
def printMatrix(self, matrix):
ans = []
while len(matrix) != 0:
ans += matrix[0][:]
matrix = matrix[1:][:]
if len(matrix) == 0:
break
matrix = [[x[i-1] for x in matrix] for i in range(len(matrix[0]),0,-1)] #逆时针旋转
return ans
2019年3月20日 上午11:39 1层
@木一 good~