-
学习中心
[
博客
为创始人和工程经理提供关于扩展、管理和产品开发的见解。
社区帖子
阅读编程教程,分享你的知识,并一起成为更好的开发者。
](www.codementor.io/community/t…)
热门话题
写一篇文章
注册
寻找开发者和导师社区帖子博客注册登录
[
](www.codementor.io/projects?re…)
关注
Python/Django全栈开发者
使用Python的黑客等级沙漏挑战
发布日期:2021年6月17日
当我在Hackerrank上看到这个问题时,我想知道为什么它被放在简单难度下。
给定一个6x6的二维数组,A:
1 1 1 0 0
0 1 0 0 0
1 1 1 0 0
0 0 0 0
0 0 0 0
0 0 0 0
我们把A中的沙漏定义为指数落在A的图形表示中的这种模式的值的子集。abcdefg\begin{matrix}a & b & c\ & d & `e & f & g\end{matrix}aebdfcg
A中共有16个沙漏,沙漏之和是一个沙漏的值之和。
**任务。**计算A中每个沙漏的沙漏和,然后打印最大的沙漏和。
输入格式。有6行输入,每行包含6个空格分隔的整数,描述二维数组A。
约束。
- -9≤A[i][j]≤9-9\le A[i][j]\le 9-9≤A[i][j]≤9
- 0≤i,j≤50 (le i,j (le50≤i,j≤5
输出格式。打印A中的最大沙漏和。
嗯,经过研究,我同意这个难度。
这个问题要求的是矩阵A中每个沙漏的数值之和,并返回最高的。
沙漏是矩阵A的一个子集。它是一个3x3矩阵,第二行只有一个元素,这个元素位于第二列:abcdefg\begin{matrix}a & b & c\ & d & \e & f & gend{matrix}aebdfcg
限制条件的解释
-9 A\[i\]\[j\] 9 意味着每个元素都是一个数字,因为它的范围在-9和9之间,包括
意味着i和j的范围在0到5之间,表明行数和列数都不超过6(因为数组是零索引的,矩阵是数组的一种类型。)
标记的数组
让我们给我们的数组A的单元格编号如下。
123456789101112131415161718192021222324252627282930313233343536\begin{matrix}1&2&3&4&5&6\\ 7&8&9&10&11&12\\ 13&14&15&16&17&18\\ 19&20&21&22&23&24\\ 25&26&27&28&29&30\\ 31&32&33&34&35&36end\matrix}171319253128142026323915212733410162228345111723293561218243036
上述6x6矩阵有36个元素,编号为1-36
在row[0],列[0],A[0][0],我们有1
在行[0],列[1],A[0][1],我们有2
在行[0],列[2],A[0][2],我们有3
。..
在行[1],列[0],A[1][0],我们有7
在行[1],列[1],A[1][1],我们有8
...
在行[2],列[0],A[2][0],我们有13
...
在行[2],列[5],A[2][5],我们有18
...
在行[5],列[0],A[5][0],我们有31
...
在行[5],列[5],A[5][5],我们有36。
沙漏
我们的编号数组A的第一个沙漏将是。
row[0]column[0]row[0]column[1]row[0]column[2]row[1]column[0]row[1]column[1]row[1]column[2]row[2]column[0]row[2]column[1]row[2]column[2]\begin{matrix}row[0]column[0] &row[0]column[1] & row[0]column[2]\ row[1]column[0] & row[1]column[2]\ row[2]column[0] & row[2]column[1] &row[2]column[2]\end{matrix}row[0]column[0]row[1]column[0]row[2]column[0]row[0]column[1]row[1]column[1]row[2]column[1]row[0]column[2]row[1]column[2]row[2]column[2]thats is[1238131415]\begin{bmatrix}1&2&3\&8&\13&14&15\end{bmatrix}⎣⎡1132814315⎦⎤
然后。..
[2349141516]begin{bmatrix}2&3&4\ &9& \14&15&16end{bmatrix}⎣⎡2143915416⎦⎤, [34510151617]begin{bmatrix}3&4&5\ &10& \15&16&.17\end{bmatrix}⎣⎡31541016517⎦⎤, [45611161718]\begin{bmatrix}4&5&6\\ &11& \\16&17&18\end{bmatrix}⎣⎡41651117618⎦⎤
[78914192021]\begin{bmatrix}7&8&9\\ &14& \\19&20&21\end{bmatrix}⎣⎡71981420921⎦⎤, [891015202122]\begin{bmatrix}8&9&10\\ &15& \\20&21&22\end{bmatrix}⎣⎡820915211022⎦⎤, [9101116212223]\begin{bmatrix}9&10&11\\ &16& \\21&22&23\end{bmatrix}⎣⎡9211016221123⎦⎤, [10111217222324]\begin{bmatrix}10&11&12\ &17& \22&23&24\end{bmatrix}⎣⎡10221117231224⎦⎤,
。...等等。
- 我们要以编程方式获得所有的沙漏
- 对每个沙漏的元素进行求和
- 返回最高的总和
解决方案
import math
def get_max_hour_glass_sum(arr):
result = -math.inf
for row in range(4):
for col in range(4):
hour_glass_sum = \
arr[row][col] + arr[row][col+1] + arr[row][col+2] + \
arr[row+1][col+1] + \
arr[row+2][col] + arr[row+2][col+1] + arr[row+2][col+2]
result = max((result, hour_glass_sum))
print(result)
在上面的代码中,我们导入了math 模块,所以我们可以在我们的函数中使用它。
- 我们定义了我们的函数
get_max_hour_glass_sum,它以arr为参数。 - 我们将负无穷(-math.inf)分配给
result变量。由于问题要求最大和,我们从负无穷开始,并将result的值改为高于当前result值的沙漏和。每次我们生成沙漏的总和时,我们都将其与result的值进行核对;如果result的值更高,则保持不变,否则,result的值将变为沙漏总和的值。 - 我们运行一个嵌套的for-loop,从第一行开始直到第四行,然后是第一列直到第四列。如果我们超过了第四行或第四列,我们就不能实现沙漏了。例如,使用我们上面的数字矩阵,到第五列就可以得到。[56121718]\begin{bmatrix}5&6&\\ &12& \\17&18&\end{bmatrix}⎣⎡51761218⎦⎤
- 我们将当前元素和它的邻居组成的沙漏相加,并将总和分配给
hour_glass_sum - 我们检查
hour_glass_sum和result之间的最高值,并将其分配给结果。 - 最后,我们打印出结果。
如果有更有效的方法来实现这个结果,请告诉我,我很想学习。
祝您愉快!
感谢知识中心
照片:Nathan DumlaoonUnsplash
报告
喜欢这个帖子吗?如果有帮助,请给Olaide Alaka一个赞。
1
分享
Python/Django全栈开发者
我是一名全栈开发人员,精通Python/Django与JavaScript、HTML、CSS、jQuery/Ajax。我已经开发了几个网络和桌面应用程序,包括学校管理,测验,学校学习,电子商务和库存应用程序。
关注
发现并阅读Olaide Alaka的更多文章
开始
喜欢这个帖子吗?
请为Olaide留下喜欢和评论
1
成为第一个分享您意见的人
提交
显示更多回复