刷题 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中跑下来的中间返回的都是元组,所以不知道系统是怎么判定是否通过的。很迷。

原文地址:https://www.cnblogs.com/Komnenos/p/python_zip.html

时间: 2024-08-03 20:03:42

刷题 11/05的相关文章

刷题11 矩形覆盖问题

描述:  我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路: 这种题开始肯定要找规律, 看了看, n = 1时, 一种方法: n = 2时, 两种方法: n = 3时,三种方法: n = 4时, 五种方法: ... : 很自然想起了斐波那契数列. 证明一下: 设 n 列一共有 f(n) 种无重叠的覆盖方法,先上一个自己画的图方便理解. 1.对于n > 2的情况:首先我们可以知道小矩形是2 * 1,整个矩形为2

刷题11. Container With Most Water

一.题目说明 11.Container With Most Water,这个题目难度是Medium. 二.我的做法 乍一看,简单啊,两个for循环就可以了,我在本地写的. #include<iostream> #include<vector> #include<math.h> using namespace std; class Solution{ public: int maxArea(vector<int> &height){ int max =

面试刷题11:java系统中io的分类有哪些?

随着分布式技术的普及和海量数据的增长,io的能力越来越重要,java提供的io模块提供了足够的扩展性来适应. 我是李福春,我在准备面试,今天的问题是: java中的io有哪几种? java中的io分3类: 1,BIO ,即同步阻塞IO,对应java.io包提供的工具:基于流模型,虽然直观,代码实现也简单,但是扩展性差,消耗资源大,容易成为系统的瓶颈: 2,NIO,同步非阻塞io,对应java.nio包提供的工具,基于io多路复用:核心类: Channel ,Selector , Buffer ,

2017年11月1日刷题记录 | 普及组

写在前面 哇Cys好菜啊! 哇Cys连普及组都不会打了啊! 哇要Noip了好紧脏啊! 哇Cys要开始刷题了 然后重点是Cys好菜菜菜菜菜菜啊!!!! 以下题目来自题库比赛 Task-1  A-B 题目描述 出题是一件痛苦的事情! 题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈! 好吧,题目是这样的:给出一串数以及一个数字C,要求计算出所有A-B=C的数对的个数.(不同位置的数字一样的数对算不同的数对) 输入输出格式 输入格式: 第一行包括2个非负整数N和

【leetcode刷题笔记】Sum Root to Leaf Numbers

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / 2 3 T

【leetcode刷题笔记】Longest Consecutive Sequence

Given an unsorted array of integers, find the length of the longest consecutive elements sequence. For example,Given [100, 4, 200, 1, 3, 2],The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4. Your algorithm should run in

【leetcode刷题笔记】Remove Duplicates from Sorted Array II

Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For example,Given sorted array A = [1,1,1,2,2,3], Your function should return length = 5, and A is now [1,1,2,2,3]. 题解: 设置两个变量:右边kepler和前向游标forward.如果当前kepeler所指的元素和

轻院 2177 小姐姐的忠告:少吃辣条多刷题

题目链接:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2177 题目大意:n个球放入n个箱子中,每个箱子放一个.每个球都是独一无二的,问方案数能被最大2的几次方整除. 解题思路:很明显方案数目就是n!,而所求的实际上是2~n中每个数的中有几个2.显然奇数可忽略,对于1~n的所有偶数来说,一次除二之后所有数都缩小了一半,即相当于求1~n/2的所有偶数,反复如此,可以很快得到思路. 代码: 1 const int inf = 0x3f3f3f3f

COGS2642 / Bzoj4590 [Shoi2015]自动刷题机

Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 906  Solved: 321 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写程序,每秒,自动刷题机的代码生成模 块会有两种可能的结果: A.写了x行代码. B.心情不好,删掉了之前写的y行代码.(如果y大于当前代码长度则相当于全部删除.) 对于每