首页 > 试题广场 >

顺时针打印矩阵

[编程题]顺时针打印矩阵
  • 热度指数:21935 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。

给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。

测试样例:
[[1,2],[3,4]],2,2
返回:[1,2,4,3]
# -*- coding:utf-8 -*-

class Printer:
    def clockwisePrint(self, mat, n, m):
        # write code here
        # 对角线表开始。奇表示一行或者一列结尾
            l = []
            diag_n = int(n / 2)
            diag_m = int(m / 2)
            for i in range(0, min(diag_m, diag_n)):
                for j in range(i, m-i):
                    l.append(mat[i][j])
                for i_ in range(i+1, n-i):
                    l.append(mat[i_][m-i-1])
                for j_ in range(m-i-2, i-1, -1):
                    l.append(mat[n-i-1][j_])
                for i_ in range(n-i-2, i, -1):
                    l.append(mat[i_][i])
            flag_n = n % 2 != 0
            flag_m = m % 2 != 0
            if diag_n > diag_m and flag_m:
                for i in range(min(diag_m, diag_n),min(diag_m, diag_n)+(n-2*int((m-1)/2))):
                    l.append(mat[i][min(diag_m, diag_n)])
            elif diag_n < diag_m and flag_n:
                for j in range(min(diag_m, diag_n), min(diag_m, diag_n) + (m - 2*int((n - 1) / 2))):
                    l.append(mat[min(diag_m, diag_n)][j])
            elif diag_n == diag_m and flag_n and flag_m:
                l.append(mat[diag_n][diag_n])
            return l

            
发表于 2019-10-29 15:33:49 回复(0)
# -*- coding:utf-8 -*-
class Printer:
    def clockwisePrint(self, mat, n, m):
        ret = []
        while len(mat) > 0:
            ret += mat[0] #将矩阵的首行放入 ret
            mat = [x for x in zip(*mat[1:])][::-1] #去掉矩阵首行后逆时针旋转90度
        return ret

发表于 2018-08-09 11:27:19 回复(1)
# -*- coding:utf-8 -*-
#大佬们,为什么这样行不通,哪里出了问题啊
class Printer:
    def clockwisePrint(self, mat, n, m):
        x_min,y_min,x_max,y_max=0,0,n,m
        result=[]
        while x_min < x_max and y_min < y_max:#对某个矩阵一圈一圈的来提取数据
            list1=list(mat[x_min])+list(mat[:,y_max-1][x_min+1:x_max-1])+list(mat[x_max-1][::-1])+list(mat[:,y_min][x_min+1:x_max-1][::-1])
            ##         第一行                    最后一列去头去尾                最后一行倒叙              第一列去头去尾倒叙
            ##下面是把矩阵变小了,对里面的重复上面步骤
            x_min+=1
            y_min+=1
            x_max-=1
            y_max-=1
            result=result.extend(list1)#把提取的数据合并到数组里面去。
        return result
发表于 2018-07-26 11:05:07 回复(0)

python解法:

class Printer:
    def clockwisePrint(self, mat, n, m):
        res = []
        while mat:
            res += mat.pop(0)
            if mat and mat[0]:
                for row in mat:
                    res.append(row.pop())
            if mat:
                res += mat.pop()[::-1]
            if mat and mat[0]:
                for row in mat[::-1]:
                    res.append(row.pop(0))
        return res
编辑于 2017-09-12 11:57:19 回复(1)
ret = []
while len(mat) > 0:
	ret += mat[0] #将矩阵的首行放入 ret
	mat = [x for x in zip(*mat[1:])][::-1] #去掉矩阵首行后逆时针旋转90度
return ret
编辑于 2016-10-02 01:21:04 回复(6)

问题信息

难度:
5条回答 29250浏览

热门推荐

通过挑战的用户

查看代码
顺时针打印矩阵