- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Hackerrank - Dijkstra 最短距离 2
我被卡在了 TestCase 7(我唯一失败的一个),我认为这是我的错。我下载了测试用例并检查了我生成的输出。
我执行 git diff,我看不出它们之间有任何区别。你能帮我验证我的代码发生了什么吗?
或者如果我的代码中没有问题,我想更改问题:
HackerRank Platform 经常出bug吗?
在为我的求职面试做 HackerRank 挑战时,我经常遇到一个不明显的失败(通常是 13 个测试用例中的最后一两个),因此多次失败。不知道大家有没有类似的经历。我怀疑当我和 friend 一起检查我提交的代码时,我们找不到任何边缘情况或错误。它应该是完美的。作为一直在 LeetCode 中编码的程序员,这让我感到害怕,我开始在 HackerRank 上进行训练。
请指教。谢谢
资源:
P.S 在 google drive 文件夹中,我附上了我的输出:output_me.txt
和 ground truth 输出:output.txt
。我确实为两个输出添加了新行(最初,所有答案都在一长行中,添加了新行以使其更易于阅读。)
代码:
import os
from collections import defaultdict
from heapq import heappop, heappush
MAX_INT = 2**31
# Build Graph
def buildGraph(edges):
graph = defaultdict(list)
trackMinEdge = {}
# build min edges from u - v (adjacent)
# for handling duplicate edges
for u, v, weight in edges:
u, v = min(u, v), max(u, v)
if (u, v) in trackMinEdge:
minWeight = trackMinEdge[(u, v)]
if minWeight <= weight:
# do not update
continue
# only update if (u, v) not in trackMinWeight
# or the new weight is smaller than minWeight
trackMinEdge[(u, v)] = weight
# build graph from minimum adjancent edge
for u, v in trackMinEdge:
weight = trackMinEdge[(u, v)]
graph[u].append((weight, v))
graph[v].append((weight, u))
return graph
# DJIKSTRA
def djikstra(n, graph, src, dest=None):
dists = {}
# setups
seen = set()
queue = [(0, src)]
dists[src] = 0
while queue:
dist_u, u = heappop(queue)
if u in seen: continue
seen.add(u)
for weight, v in graph.get(u, []):
if v in seen: continue
alt = dists[u] + weight
if alt < dists.get(v, MAX_INT):
dists[v] = alt
heappush(queue, (alt, v))
return dists
# Complete the shortestReach function below.
def shortestReach(n, edges, src):
graph = buildGraph(edges)
# edge cases: src not connected to any node
if not (src in graph):
return [-1 for _ in range(n-1)]
dists = djikstra(n, graph, src)
distsTable = []
for i in range(1, n+1):
if i in dists and i != src:
distsTable.append(dists[i])
elif not (i in dists):
distsTable.append(-1)
return distsTable
if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w+')
t = int(input())
for t_itr in range(t):
nm = input().split()
n = int(nm[0])
m = int(nm[1])
edges = []
for _ in range(m):
edges.append(list(map(int, input().rstrip().split())))
s = int(input())
result = shortestReach(n, edges, s)
fptr.write(' '.join(map(str, result)))
fptr.write('\n')
fptr.close()
问候,
我
最佳答案
我尝试了您的代码,它实际上适用于 PyCharm 上的 Test Case#7 - 实际输出与预期输出相匹配。但是,由于运行时错误,相同的代码在 Hackerrank 上失败。为什么会发生?
Runtime error/Segmentation Fault. Your code terminated unexpectedly. Did you overrun your array? Is your code trying to divide by zero?
显然,这不是因为我们用 0
来除某物因为它在本地工作。还有什么?根据Hackerrank Environment对于 Python,内存限制为 512 Mb
寻求解决方案。
因此,我决定使用 tracemalloc
来测量您的解决方案的内存使用情况。模块。
import tracemalloc
tracemalloc.start()
...
# <solution code here>
...
print("Current usage: %d, Peak usage: %d" % tracemalloc.get_traced_memory())
输出
Current usage: 549627153, Peak usage: 550966939
如您所见,它实际上超出了 512 Mb
的限制这就是为什么你可以拥有这个 Runtime Error
.因此,请尝试降低解决方案的空间复杂性。
我还注意到另一个问题 - 如果您使用 time
来衡量时间复杂度模块那么它需要超过40
测试用例 #7 完成的秒数。因此,如果您先解决空间复杂度问题,这可能是您的下一个问题。
最后,不,这里没有关于 Hackerrank 的错误 - 我的 Python 解决方案已经通过了所有测试。
更新
正如@Daniel(问题的作者)所问,我提供了我的优化版本的解决方案,它通过了 Hackerrank 上的所有测试。
# Complete the shortestReach function below.
def shortestReach(n, distanceMatrix, s):
queue = list()
queue.append(s)
minDistances = [-1] * (n + 1)
minDistances[s] = 0
while queue:
currentNode = queue.pop(0)
for neighbor in distanceMatrix[currentNode]:
newDistance = minDistances[currentNode] + distanceMatrix[currentNode][neighbor]
prevDistance = minDistances[neighbor]
if minDistances[neighbor] == -1:
minDistances[neighbor] = newDistance
else:
minDistances[neighbor] = min(newDistance, minDistances[neighbor])
if prevDistance != minDistances[neighbor]:
queue.append(neighbor)
del minDistances[s]
del minDistances[0]
print (' '.join(map(str, minDistances)))
if __name__ == '__main__':
t = int(input())
for t_itr in range(t):
nm = input().split()
n = int(nm[0])
m = int(nm[1])
distanceMatrix = [dict() for _ in range(n + 1)]
for _ in range(m):
edge = list(map(int, input().rstrip().split()))
i = edge[0]
j = edge[1]
weight = edge[2]
if i not in distanceMatrix[j]:
distanceMatrix[i][j] = distanceMatrix[j][i] = weight
else:
distanceMatrix[i][j] = distanceMatrix[j][i] = min(weight, distanceMatrix[i][j])
s = int(input())
shortestReach(n, distanceMatrix, s)
没有理由使用 heap
这里 - queue
完全够了。将节点添加到 queue
的唯一标准如果它的距离在当前步骤发生了变化。
关于python-3.x - Hackerrank 测试用例不正确? Dijkstra 最短距离 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58677483/
function birthdayCakeCandles(n, ar) { let max = 0; for(let i = 0; i max) { max = ar[i];
我正在尝试解决 https://www.hackerrank.com/challenges/find-hackerrank在 Obj-C 上,并通过 xCode 获得正常输出,但不是通过 hacker
我一直在努力解决这个挑战,并且有点想知道该怎么做。但是经过我所有的尝试,我只能通过测试用例,并且在提交面板中还有一个案例。之后一切都失败了 问题: 一家公司要求简化其产品分配策略,给定 n 个产品,每
问题陈述 :Sherlock and Moving Tiles TL;博士 : 给定 2 正方形;边长为 L,放置在 x-y 平面中,两个正方形 搬家沿线 y=x (沿正 x 和 y)速度为 S1 和
这个问题与this challenge有关在 HackerRank 上。它似乎在某些情况下失败了,但我不清楚算法有什么问题(很多人似乎有超时问题,这不是问题,一切都运行得很快,我看到的所有情况都通过了
我一直在应对这个挑战: Count Triplets ,经过大量的努力,我的算法并没有适用于每个测试用例。 由于在讨论中,我看到了一段代码并试图找出代码的真正功能,但我仍然无法理解这段代码是如何工作的
请参阅最近在 HackerRank 上发布的以下问题 Adam is standing at point (a,b) in an infinite 2D grid. He wants to know
(HakerRank) task是让我格式化测试用例给出的输入。 字符串和整数之间需要有 15 个空格,并且如果只有两位数,则在整数前面附加一个零,我的代码据我所知完成了这一点,并与预期的输出匹配,但
大多数人可能熟悉这个问题,但对于那些不熟悉的人来说: Given 32-bit unsigned integers flip their bits and print the resulting in
给定一个未排序的整数列表,找到它们之间绝对差最小的一对元素。如果有多对,请全部找到。 我的推理是将每个:arr[j] - arr[i] 与lowest 进行比较,如果它小于或等于该值,则将该值添加到数
我正在解决重复字符串 hackerrank 问题。但是所有的测试用例都没有运行可能是我的逻辑不正确。问题是这样的 下面给出了我的代码,其中包含没有变量的repeatedString和countingA
问题的链接如下: https://www.hackerrank.com/challenges/strange-code/problem static long strangeCounter(long
我正在尝试解决this hackerrank 上的问题,我花了一段时间才找到窍门。 技巧在于异或的属性以及数字出现在数组子集中的次数,其中子集是连续的(请注意)。 因此,如果我们有 1,2,3,子集将
我无法理解代码中这一行的用法,有人可以解释一下这个问题或提供一些不同的方法来解决这个问题 问题链接:https://www.hackerrank.com/challenges/15-days-of-l
为了问题陈述,我附上了两张照片。 /image/22zyM.png /image/5c8e6.png 我的代码: for(i=0;i #include #include #include int
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我试图解决this 。我的算法在离线编译器中给出了正确的答案。我不知道错误在哪里。我对 C 语言完全陌生。 该问题要求创建一个函数来查找方阵左右对角线的绝对差。 这是我的网站解决方案。当我在线运行代码
我想创建一个函数来返回一个数组,其中包含完成另一个数组所需的步骤数,但有一个小条件,我只想在 0 上执行步骤,这意味着如果我有数组 c = [0,0 ,0,1,0,0,1,0] 它将把前三个 0 作为
我正在尝试 hackerrank 中的 Morgan and a String 挑战( https://www.hackerrank.com/challenges/morgan-and-a-strin
我是初学者,欢迎替代此代码。输入值后程序崩溃。我也想更多地了解这个问题,因为我已经看过很多次了。 #include #include #include #include using namespace
我是一名优秀的程序员,十分优秀!