算法题/顺时针打印矩阵

python2.7

对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。
给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。

分析:
zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。

这里写图片描述

这里写图片描述

zip(*ziped),zip和*组合表示将压缩内容解压
zip(*[(1,4),(2,5),(3,6)])与zip(*[[1,4],[2,5],[3,6]])结果相同
这里写图片描述

同时,zip(*[[1,4],[2,5],[3,6]])相当于把矩阵[[1,4],[2,5],[3,6]]顺时针旋转90度,再在将所有元素倒序。

顺时针旋转90度

zip(*a[::-1])

逆时针旋转90度

zip(*a)[::-1]

lambda函数,,lambda作为一个表达式,定义了一个匿名函数
g = lambda x:x+10
g(1)= 11
g(2) = 12

map函数
a = [1,2,3]
map(lambda x: x*10,a),将a中所有元素作用于lanbda函数
===>[10,20,30]

顺时针旋转:将要旋转的倒序后在zip(*)
算法题/顺时针打印矩阵_第1张图片

逆时针旋转:将要旋转的zip(*)后倒序
这里写图片描述

综上分析

思路
1 2 3
4 5 6 ===》1 2 3
7 8 9

4 5 6
7 8 9 旋转90度,打印第一行

5 8
4 7 旋转90度,打印第一行

#coding:utf-8
def shunxuprint(a):
    result = []
    while a:
        result += a.pop(0)
        #将逆时针旋转
        a = zip(*a)[::-1]
        #转为list
        a =map(list,a)
    return result

print(shunxuprint([[1,2,3],[4,5,6].[7,8,9]]))

这里写图片描述

面向对象

#coding:utf-8
class Printer:
    def clockwisePrint(self,mat,n,m):
        self.result = []
        while mat:
            self.result += mat.pop(0)
            #逆时针旋转
            mat = zip(*mat)[::-1]
            #将tuple转为list
            mat = map(list,mat)
        return self.result

p = Printer()
print(p.clockwisePrint([[1,2,3],[4,5,6],[7,8,9]],3,3))

你可能感兴趣的:(面试算法题,算法题)