首页 > 试题广场 > 顺时针打印矩阵
[编程题]顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.

82个回答

添加回答
推荐
/*解题思路:顺时针打印就是按圈数循环打印,一圈包含两行或者两列,在打印的时候会出现某一圈中只包含一行,要判断从左向右打印和从右向左打印的时候是否会出现重复打印,同样只包含一列时,要判断从上向下打印和从下向上打印的时候是否会出现重复打印的情况*/
class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int>res;
        res.clear();
        int row=matrix.size();//行数
        int collor=matrix[0].size();//列数
        //计算打印的圈数
        int circle=((row<collor?row:collor)-1)/2+1;//圈数
        for(int i=0;i<circle;i++){
            //从左向右打印
            for(int j=i;j<collor-i;j++)
                res.push_back(matrix[i][j]);          
            //从上往下的每一列数据 
            for(int k=i+1;k<row-i;k++)
                res.push_back(matrix[k][collor-1-i]);
            //判断是否会重复打印(从右向左的每行数据) 
            for(int m=collor-i-2;(m>=i)&&(row-i-1!=i);m--) 
                res.push_back(matrix[row-i-1][m]); 
            //判断是否会重复打印(从下往上的每一列数据)
            for(int n=row-i-2;(n>i)&&(collor-i-1!=i);n--) 
                res.push_back(matrix[n][i]);}
        return res;
    }
};


编辑于 2015-09-07 13:31:21 回复(43)
class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        return matrix and list(matrix.pop(0)) + self.printMatrix(zip(*matrix)[::-1])
        # write code here

发表于 2019-06-17 16:24:38 回复(0)
若matrix不为空,将matrix.pop(0)添加至列表,pop后的列表逆时针旋转90度,该操作用zip和列表逆序实现,循环至matrix为空,输出列表
class Solution:
    def printMatrix(self, matrix):
        out_list=[]
        while matrix:
            out_list+=matrix.pop(0)
            matrix = list(zip(*matrix))
            for i in range(len(matrix)):
                matrix[i] = list(matrix[i])
            matrix=matrix[::-1]
        return out_list

编辑于 2019-06-06 19:56:42 回复(0)
class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        # write code here
        mSize=len(matrix)
        xSize=len(matrix[0])
        listR=[]
        listR.extend(matrix[0])
        #强化学习的概念,已经被用了,就不使用了,顺指针靠右走。
        for i in range(mSize*xSize):
            if len(listR)<mSize*xSize:
                matrix.__delitem__(0)
                self.rotate(matrix)
                listR.extend(matrix[0])
            else:
                break
        return listR

    def rotate(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: void Do not return anything, modify matrix in-place instead.
        """
        #matrix[:] = map(list,zip(*matrix[::-1]))
        matrix[:] = map(list, zip(*matrix))[::-1]
        #return matrix

        # return matrix
发表于 2019-05-27 17:09:37 回复(0)
    def printMatrix(self, matrix):
        res = []
        while matrix:
            # 第一行
            res.extend(matrix.pop(0))
            # 最后一列
            if matrix and matrix[0]:
                for row in matrix:
                    res.append(row.pop())
            # 最后一行
            if matrix:
                last_row = matrix.pop()
                res.extend(last_row[::-1])
            # 第一列
            if matrix and matrix[0]:
                for row in matrix[::-1]:
                    res.append(row.pop(0))
        return res
发表于 2019-05-09 15:15:27 回复(0)

# -*- coding:utf-8 -*- class Solution: # matrix类型为二维列表,需要返回列表  def printMatrix(self, matrix): # write code here  if len(matrix) == 0: return []
        printlist = []
        m = len(matrix)
        n = len(matrix[0]) if m == 1: for i in range(n):
                printlist.append(matrix[0][i]) return printlist elif n == 1: for i in range(m):
                printlist.append(matrix[i][0]) return printlist if min(m, n) & 1 == 0:
            curcle = min(m, n) >> 1  else:
            curcle = 1 + min(m, n) >> 1  for cur in range(curcle): for j in range(cur, n - cur):
                printlist.append(matrix[cur][j]) for k in range(1 + cur, m - cur):
                printlist.append(matrix[k][n - cur - 1]) for l in range(n - cur - 2, cur, -1): if m - 1 - 2 * cur != 0:
                    printlist.append(matrix[m - 1 - cur][l]) for q in range(m - cur - 1, cur, -1): if n - 1 - 2 * cur != 0:
                    printlist.append(matrix[q][cur]) return printlist

编辑于 2019-04-29 21:06:22 回复(0)

-- coding:utf-8 --

class Solution:

# matrix类型为二维列表,需要返回列表
def printMatrix(self, matrix):
    # write code here
    a=matrix
    n = 1
    b = []
    while (a and a[0]):
        if (n == 1):
            b.extend(a[0])
            a.remove(a[0])
        if (n == 2):
            for i in range(len(a)):
                m = len(a[i])
                b.append(a[i][m - 1])
                a[i][m-1] = ''
                a[i].remove('')
        if (n == 4):
            for i in range(len(a) - 1, -1, -1):
                b.append(a[i][0])
                a[i][0] = ''
                a[i].remove('')
        if (n == 3):
            m = a[len(a) - 1]
            for i in range(len(m)-1,-1,-1):
                b.append(m[i])
            a.remove(m)
        n = n + 1
        if (n > 4):
            n = n - 4
    return b
发表于 2019-04-20 16:58:05 回复(1)

class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        # write code here
        result=[]
        while matrix:
            result+=matrix[0]
            matrix=list(zip(*matrix[1:]))[::-1]
        return result

发表于 2019-04-18 14:44:50 回复(0)
# -*- coding:utf-8 -*-
class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        # write code here
      
        m=len(matrix)
        n=len(matrix[0])
        left=0
        right=n-1
        up=0
        down=m-1
        direct=0
        res=[]
        if m==0:
            return []
        while True:
            if direct==0:
                for i in range(left,right+1):
                    res.append(matrix[left][i])
                up+=1
            if direct==1:
                for i in range(up,down+1):
                    res.append(matrix[i][right])
                right-=1
            if direct==2:
                for i in range(right,left-1,-1):
                    res.append(matrix[down][i])
                down-=1
            if direct==3:
                for i in range(down,up-1,-1):
                    res.append(matrix[i][left])
                left+=1
            direct=(direct+1)%4
            if left>right or up>down:
                return res
              
发表于 2019-04-12 14:49:10 回复(0)
class Solution:
# matrix类型为二维列表,需要返回列表class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        # write code 
        if not matrix:
            return []
        res = []
        while matrix:
            res += matrix.pop(0)
            matrix = zip(*matrix)[::-1]
        return res

编辑于 2019-04-06 20:34:59 回复(0)
# -*- coding:utf-8 -*-
class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        # write code here
        if matrix:
            return list(matrix.pop(0)) + self.printMatrix(zip(*matrix)[::-1])
        else:
            return []

发表于 2019-04-06 00:37:11 回复(0)
python 剑指offer解法
class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        # write code here
        if matrix==[[]]:
            return
        res=[]
        start=0
        rows=len(matrix)
        columns=len(matrix[0])
        while(rows>start*2 and columns>start*2):
            res += self.PrintMatrixInCircle(matrix,rows,columns,start)
            start+=1
        return res

    def PrintMatrixInCircle(self,matrix,rows,columns,start):
        endX=columns-start-1
        endY=rows-start-1
        res=[]
        #从左到右打印一行
        for i in range(start,endX+1):
            res.append(matrix[start][i])
        #从上到下打印一列
        if start<endY:
            for i in range(start+1,endY+1):
                res.append(matrix[i][endX])
        #从右到左打印一行
        if start<endX and start<endY:
            for i in range(endX-1,start-1,-1):
                res.append(matrix[endY][i])
        #从下到上打印一列
        if start<endX and start<endY-1:
            for i in range(endY-1,start,-1):
                res.append(matrix[i][start])
        return res

发表于 2019-04-05 22:01:08 回复(0)
先取矩阵的第一行,接着将剩下作为新矩阵进行一个逆时针90度的翻转,接着获取第一行,直到矩阵为空。 

发表于 2019-04-05 16:10:13 回复(0)
# 记录下标位置, 走过的位置用'#'标记, 重点在于行走方向的优先级
class Solution:
    def printMatrix(self, matrix):
        if not matrix:
            return
        direction = [[0,1],[1,0],[0,-1],[-1,0]]
        row = len(matrix)
        col = len(matrix[0])
        start = [0, -1]
        res = []
        index = 0
        for i in range(row*col):
            for j in range(index, index+4):
                item = direction[j%4]
                now = [start[0] + item[0], start[1] + item[1]]
                if 0 <= now[0] < row and 0 <= now[1] < col:
                    if matrix[now[0]][now[1]] != '#':
                        res.append(matrix[now[0]][now[1]])
                        matrix[now[0]][now[1]] = '#'
                        start = now
                        index = j%4
                        break
        return res 

发表于 2019-04-02 22:22:24 回复(0)

思路:将矩形不断取上层,然后左转,重复直到矩形为空
```python

# -*- coding:utf-8 -*-
class Solution:
# matrix类型为二维列表,需要返回列表
def printMatrix(self, matrix):
    # write code here
    ret=[]
    while len(matrix)>0:
        ret+=matrix.pop(0)
        matrix=list(zip(*matrix))[::-1]
    return ret
编辑于 2019-03-26 09:51:19 回复(0)
写的超级繁琐。。比不了各位大佬。。

class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        # write code here
        list = []
        while len(matrix) is not 0:
            col = len(matrix[0])
            matrix[0].reverse()
            for i in range(col):
                list.append(matrix[0].pop())
            del matrix[0]
            if len(matrix) == 0:
                return list
            while [] in matrix:
                matrix.remove([])
            row = len(matrix)
            for j in range(row):
                list.append(matri***op(-1))
            while [] in matrix:
                matrix.remove([])
            if len(matrix) == 0:
                return list
            col = len(matrix[0])
            for k in range(col):
                list.append(matrix[row-1].pop(-1))
            del matrix[row-1]
            if len(matrix) == 0:
                return list
            while [] in matrix:
                matrix.remove([])
            row = len(matrix)
            for u in range(row):
                list.append(matrix[row-1].pop(0))
                row -= 1
        return list
发表于 2019-03-24 21:45:35 回复(0)
# -*- coding:utf-8 -*-
#多次逆时针翻转
class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, matrix):
        # write code here
        ans = []
        while matrix:
            ans.extend(matrix[0])
            matrix.pop(0)
            if matrix:
                matrix = self.turn(matrix)
        return ans 
    def turn(self, matrix):
        row = len(matrix)
        col = len(matrix[0])
        col_new = row
        row_new = col
        new_matrix = []
        for i in range(row_new):
            new_matrix.append([])
            for j in range(col_new):
                new_matrix[i].append(matrix[j][col-1-i])
        return new_matrix

发表于 2019-03-24 19:28:31 回复(0)

利用python2中的zip函数对矩阵转置,再用list[::-1]作行对调。实现矩阵的逆时针旋转,接着递归打印第一行。

# -*- coding:utf-8 -*-
class Solution:
    # matrix类型为二维列表,需要返回列表
    def printMatrix(self, M):
        # write code here
        if not M or not M[0]:
            return []
        return self.Recur(M)
    def Recur(self, M):
        if not M:
            return []
        return list(M[0]) + self.Recur( zip(*M[1:])[::-1] )
发表于 2019-03-21 13:35:41 回复(0)
看了python 头位的代码,感觉不太严谨,这种是常规思路,新手勿喷。
class Solution:
    def printMatrix(self, matrix):
        # write code here
        arra = []
        row = len(matrix)
        col = len(matrix[0])
        end = min(row, col)
        row1, col1 = row, col
        for i in range((end + 1) / 2):
            for j in range(i, col - i):
                arra.append(matrix[i][j])
            row1 -= 1
            if row1 and col1:
                for k in range(i + 1, row - i):
                    arra.append(matrix[k][col - 1 - i])
            col1 -= 1
            if row1 and col1:
                for m in range(col - i - 2, i - 1, -1):
                    arra.append(matrix[row - 1 - i][m])
            row1 -= 1
            if row1 and col1:
                for n in range(row - i - 2, i, -1):
                    arra.append(matrix[n][i])
            col1 -= 1
        return arra

发表于 2019-03-20 12:07:04 回复(0)