python 实现矩阵按对角线打印
作者:iamaline 发布时间:2022-08-01 02:01:07
标签:python,矩阵,对角线,打印
如下所示:
Description:
将一个矩阵(二维数组)按对角线向右进行打印。(搜了一下发现好像是美团某次面试要求半小时手撕的题)
Example:
Input:
[
[1,2,3,4],
[5,1,2,3],
[9,5,1,2]
]
Output:
[[4],
[3, 3],
[2, 2, 2],
[1, 1, 1],
[5, 5],
[9]]
思路: 考虑每条对角线开头元素的index(i,j)。i从0开始遍历,j从col-1开始遍历,首先考虑j的变化,若j变为0,则保持不变,让i变化。在确定开头元素后,可通过设置i+1,j+1及不超过范围来向lst中对角线上添加元素。
对于以上例子,各对角线开头元素的index分别为:
(0,3)
(0,2)
(0,1)
(0,0)
(1,0)
(2,0)
其中各lst中的元素index分别为:
[(0,3)]
[(0,2),(1,3)]
[(0,1),(1,2),(2,3)]
[(0,0),(1,1),(2,2)]
[(1,0),(2,1)]
[(2,0)]
代码:
def diagonal_right(matrix):
if not matrix:
return []
row = len(matrix)
col = len(matrix[0])
col2 = col
result = []
for i in range(row):
for j in range(col2 - 1, -1, -1): #j倒序遍历
lst = []
i1,j1 = i,j #i1,j1用于方便同一对角线元素的添加,否则改变i,j影响开头元素的选择
while i1 <= row - 1 and j1 <= col - 1:
lst.append(matrix[i1][j1])
j1 += 1
i1 += 1
result.append(lst)
if i == 0 and j == 0:#当遍历完(0,0)开头的一条对角线后,让j固定为0
col2 = 1
return('the result is: %s'%result,'end')
#test
print(diagonal_right([[1],[2]]))
print(diagonal_right([[1]]))
print(diagonal_right([
[1,2,3,4],
[5,1,2,3],
[9,5,1,2]
]))
输出:
变型: 由(0,0)开始向左打印:
思路: 同样考虑每条对角线开头元素的index(i,j)。i从0开始遍历,j也从0开始遍历,首先考虑j的变化,若j变为col-1,则保持不变,让i变化。在找到开头元素后,可通过设置i+1,j-1及不超过范围来向lst中对角线上添加元素。
对于以上例子,各对角线开头元素的index分别为:
(0,0)
(0,1)
(0,2)
(0,3)
(1,3)
(2,3)
其中各lst中的元素index分别为:
[(0,0)]
[(0,1),(1,0)]
[(0,2),(1,1),(2,0)]
[(0,3),(1,2),(2,1)]
[(1,3),(2,2)]
[(2,3)]
代码:
def diagonal_left(matrix):
if not matrix:
return []
row = len(matrix)
col = len(matrix[0])
k=0
result = []
for i in range(row):
for j in range(k,col): # j顺序遍历
lst = []
i1, j1 = i, j # i1,j1用于方便同一对角线元素的添加,否则改变i,j影响开头元素的选择
while i1 <= row - 1 and j1 >=0:
lst.append(matrix[i1][j1])
j1 -= 1
i1 += 1
if i==0 and j==col-1:
k=col-1
result.append(lst)
return ('the result is: %s' % result, 'end')
# test
print(diagonal_left([[1],[2]]))
print(diagonal_left([[1]]))
print(diagonal_left([
[1,2,3,4],
[5,1,2,3],
[9,5,1,2]
]))
输出:
此问题还可以有多种变型,若从左下角,右下角按对角线打印等,只需要进行简单的修改即可实现。
来源:https://blog.csdn.net/sinat_30324577/article/details/82765836
0
投稿
猜你喜欢
- 手痒痒系列之简单的放大镜写了个放大镜功能,可以设置显示的宽高width,height显示的位置,float ‘left’ 'righ
- django外键使用 一对一因为django中处于安全和方便将数据库中的表封装成模型,所以很多sql原生的功能无法使用, 比如 left j
- 是时候了—— 在大部分情况下当用户输入密码时把它们用清晰的文字显示出来。一直以来,提供反馈、把系统状态形象化是最基本的可用性原则,当用户输入
- 因一些特殊需求需要以参数的形式获取字典 * 定的值,网上搜了一下并没有特别好的实现(并没有太认真去找~),所以自己实现了一个,以供大家参考:)
- 因此计划先把数据转插入一个临时表,再对临时表的数据进行分析。 问题点是如何动态创建临时表。原先Insus.NET使用下面代码实现: 代码如下
- ⛳️ 本次反反爬实战案例背景本篇博客选择的案例是由 VX 好友提出,他希望有一篇博客能简单的介绍清楚下面这个问题。快速定位加密参数逻辑,快速
- 在前后端分离是大趋势的背景下,前端获取数据都是通过调用后台的接口来获取数据微服务的应用越来越多。Django是Python进行web应用开发
- <!--#include file="admin_Checkuser.asp"--> <%
- 研究了几天Adodb.stream和XMLHTTP的应用,找了不少很有趣的教程,下面的代码是将一个远程的页面,图片地址保存到本地的实例。将代
- 如何在寸土寸金的首页上使页面的价值最大化,是每个网站设计者最关心的话题。用户关注的页面长度、宽度都是有限的。宽度自不必说,一般网站都会根据自
- 由于文件夹可能有多层目录,因此需要对其进行递归遍历。本文采取了简单的协议定制,定义了五条命令,指令Head如下:Sync:标识开始同步文件夹
- 使用T_SQL创建数据库 TestSchool 创建一个学生表 TblStudent 创建学生成绩表 TblScore q tScoreId
- 问: 如果数据表中有时间字段,现在要迁移到其他时区的服务器上,该如何处理呢?答:在高版本的mysqldump中,新增了一个选项:--tz-u
- 然后给脚本文件运行权限,方法(1)chmod +x ./*.py方法(2)chmod 755 ./*.py (777也无所谓啦)这个命令不去
- 【目标需求】查看某一个字符串是否为中文字符串【解决办法】def check_contain_chinese(check_str): for
- 1. 解决思路首先要获得这张验证码的图片,但是该图片一般都是用的js写的,不能够通过url进行下载。解决方案:截图然后根据该图片的定位和长高
- 快速排序(QuickSort)是对冒泡排序的一种改进:基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一
- 不知道写得对不对啊!错了再改吧!加密函数Function Encodestr(s,xorstr)Dim enFor&nb
- 如果仅仅是定义表格的边框为1(border="1")和边框颜色值(如borderC
- 01-初心缘由最近在研究语音识别方向,看了很多的语音识别的资料和文章,了解了一下语音识别的前世今生,其中包含了很多算法的演变,目前来说最流行