【发布时间】:2022-01-14 00:55:27
【问题描述】:
我尝试在 HackerRank 上解决一个名为“Apple and orange”的问题,代码如下:
def countApplesAndOranges(s, t, a, b, apples, oranges):
count_apples = 0
count_oranges = 0
x = [x for x in range(s, t+1)]
pos_apple = [apple + a for apple in apples]
pos_orange = [orange + b for orange in oranges]
for i in x:
for j in pos_apple:
if j == i:
count_apples +=1
for l in pos_orange:
if l == i:
count_oranges += 1
print(count_apples)
print(count_oranges)
代码有效。 但是,当我尝试提交它时,它通过了前 3 个测试,其余测试失败,但出现异常“因超时而终止”。我检查了其中一项测试的输入,这是需要处理的大量数据,您可以在此处查看数据: https://hr-testcases-us-east-1.s3.amazonaws.com/25220/input03.txt?AWSAccessKeyId=AKIAR6O7GJNX5DNFO3PV&Expires=1642016820&Signature=J4ypdP0YzRxcOWp%2By5XaD5ITeMw%3D&response-content-type=text%2Fplain
它失败了,因为通过我的 IDE 处理具有相同输入的代码需要大约 2 分钟,但 HackerRank 测试限制为 10 秒。
我需要您的帮助来优化代码并让它运行得更快。
嵌套循环似乎是这里最大的问题,但我不知道应该用什么替换。
【问题讨论】:
-
您不需要嵌套循环。只需使用
<和>等比较运算符来检查苹果或 arange 是否在边界内。在 Python 中,你甚至可以使用if s <= j <= t:。 -
SO 不是提供代码挑战帮助的好论坛。挑战完成后,他们可能会发布“更好”的答案。也就是说,在几乎所有的挑战问题中,嵌套循环都是死亡之吻,因为它们会(如您所见)加载大量数据以查看您是否以这种方式解决了它。换个角度思考问题。有没有办法让 1 传递数据以降低时间复杂度或以某种方式利用结构?
-
谢谢大家,
codeif s -
很高兴您发布了一些输入数据,但它是如何使用的?什么是
s、t、a、b? -
s 和 t 在第一行,a 和 b 在第二行,apples 在第三行,剩下的就是橘子了。你可以在这里查看问题:hackerrank.com/challenges/apple-and-orange/…
标签: python algorithm function performance optimization