刷题 11/05

从昨天开始刷题,但是昨天比较懒,没有总结一下。今天开始总结一下刷题什么的遇到的bug和之前不注意的事情。

顺时针旋转矩阵

有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。
给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于300。

很简单的矩阵变换,我是通过两次矩阵变换得到的,首先对角线交换,然后左右翻转就可以了。

class Rotate:
    def rotateMatrix(self, mat, n):
        c = [[0 for i in range(0,n)] for j in range(0,n)]
        for i in range(0,n):
            for j in range(0,n):
                c[i][j] = mat[j][i]
        for i in range(0,n):
            c[i].reverse()
        return(c)

但是实际上之前遇到了一个问题,就是只用python自带的库并不知道怎么生成矩阵。
一开始是用下面的代码生成的
c = mat
后来意识到这样只是共享内存,然后就用这样
matrix = [[0]*n]*n
然后发现这样只是重复一行的内容,重复n行,更加完蛋。
最后
c = [[0 for i in range(0,n)] for j in range(0,n)]
据说是因为python浅引用的问题。

后来看到还有一个解法,就是python的zip函数。
zip函数是打包函数,返回对象是zip,实际上是将列表中元素打包成元组。我们可以用list转化为列表。

a = [1,3,4]
b = [4,5,6]
c = [4,5,6,7,8]
zip(a,b)
print(list(zip(a,b)))
print(list(zip(a,c)))

返回值长度为原列表中较短列表的长度。

[(1, 4), (3, 5), (4, 6)]
[(1, 4), (3, 5), (4, 6)]

zip(*)函数为解压函数,同样返回zip内容,需要用list转化为列表。

a = [1,3,4]
b = [4,5,6]
zipped = zip(a,b)
a1,a2 = zip(*zipped)
print(list(a1))
print(list(a2))

返回值为原来的列表。

[1, 3, 4]
[4, 5, 6]

然后就是本题目
list(zip(*mat))
将方阵mat转化为一个zip对象,再将其转化为列表。例如

z = [[1,2,3],[4,5,6],[7,8,9]]
a = list(zip(*z))
print(a)

输出
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
然后列表中[::-1]表示逆序,所以直接将a的每一列元组先转化为列表,再对列表进行逆序操作就可以得到。

z = [[1,2,3],[4,5,6],[7,8,9]]
for i in zip(*z):
    print(list(i[::-1]))

返回结果

[7, 4, 1]
[8, 5, 2]
[9, 6, 3]

回到原题,可以用直接生成列表

class Rotate:
    def rotateMatrix(self, mat, n):
        a = list(zip(*mat))
        for i in range(0,len(a)):
            a[i] = list(a[i])
            a[i].reverse()
        return(a)

看到有一个快速解法,即
return([x[::-1] for x in zip(*mat)])
确实这个也可以通过,但是我自己在jupyter的python3 和 在线某网站的python2中跑下来的中间返回的都是元组,所以不知道系统是怎么判定是否通过的。很迷。

猜你喜欢

转载自www.cnblogs.com/Komnenos/p/python_zip.html