python - 为什么这些 python 和 kotlin 函数在hackerrank 上的表现不同?
问题描述
我正在尝试使用 Kotlin 解决关于 Hackerrank(Hack the Interview II - Global Product Distribution)的竞赛挑战
我开始感到恼火,因为我的代码总是通过少量输入的测试用例而在较大的输入上失败,甚至在一个输入上超时。
于是上网查到了这个python代码,巧妙的解决了所有的测试用例。我什至将 Python 代码行转换为 Kotlin。但我的 Kotlin 代码始终保持与以前一样的糟糕性能。
这是两段代码。
Python:
def maxScore(a, m):
a.sort()
print(a)
x=len(a)
if x%m==0:
y=int(x/m)
else:
y=int(x/m)-1
summ=0
count=1
#print(y)
i=0
for _ in range(y):
summ=summ+(sum(a[i:i+m])*count)
count=count+1
i=i+m
print(summ)
summ=summ+sum(a[i:])*count
print(summ)
return summ%1000000007
科特林:
fun maxScore(a: Array<Int>, m: Int): Int {
a.sort()
// print(a)
val x = a.size
val y = if (x % m == 0) x / m
else (x / m) - 1
var summ = 0
var count = 1
// print(y)
var i = 0
for (s in 0 until y) {
summ += a.sliceArray(i until (i + m)).sum() * count
count++
i += m
// print(summ)
}
summ += a.sliceArray(i until a.size).sum() * count
// print(summ)
return summ % 1000000007
}
代码翻译有问题吗?如何让 Kotlin 代码在更大的测试用例上工作?
更新:copyOfRange()
性能优于sliceArray()
. 代码不再在任何测试用例上超时,但在所有大型测试用例上仍然失败
解决方案
我可以在这里看到三个问题。我现在会为你指出正确的方向。
Python 和 Kotlin 每次都复制数组。这可能是也可能不是问题。您有多达一百万个元素,每个元素只复制一次。如果这超出了您的时间限制,我会感到惊讶,但它可能会这样做。看起来你可以避免使用
.subList()
.看起来您将剩余的物品当作自己的垃圾箱一样对待。但是这个 bin 比 m 小,这是不允许的。检查这是否真的是您想要的。
Kotlin Ints 是 32 位有符号整数。在溢出之前,您最多只能存储大约 20 亿个数字。你需要避免这种情况!看看这些限制——你可以拥有多达一百万种产品,每个产品的价值高达十亿。(这与 Python 整数不同,它永远不会溢出,因此总是会给出正确的答案,但如果您尝试对非常大的数字进行操作,可能会占用大量内存并减慢速度,这很可能会导致您的程序超时。)这里有一个提示:
(a + b) % n
等于((a % n) + (b % n)) % n