刷题 11/05

2年前 (2022) 程序员胖胖胖虎阿
166 0 0

从昨天开始刷题,但是昨天比较懒,没有总结一下。今天开始总结一下刷题什么的遇到的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中跑下来的中间返回的都是元组,所以不知道系统是怎么判定是否通过的。很迷。

版权声明:程序员胖胖胖虎阿 发表于 2022年9月5日 上午9:08。
转载请注明:刷题 11/05 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...