【发布时间】:2020-07-02 17:22:12
【问题描述】:
我正在尝试使用 Kotlin 解决关于 Hackerrank(Hack the Interview II - Global Product Distribution)的竞赛挑战
我开始感到恼火,因为我的代码总是通过少量输入的测试用例而在较大的输入上失败,甚至在一个输入上超时。
于是我上网找到thispython 代码,它巧妙地解决了所有的测试用例。我什至将 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 优化了
sum(array[i:i+m])而 Kotlin 没有优化类似的 slice 和 sum 函数。 -
@Barmar 没有解释为什么大型测试用例的输出不同
-
从文档来看,
sliceArray()似乎分配了一个新数组并复制了一些东西,但 Python 可能适用于引用。 (并且可能存在整数溢出,这在 Python 中不会发生) -
你能澄清一下 - 你的 Kotlin 程序是慢还是它也得到了错误的答案?它似乎没有考虑 32 位整数的溢出问题,这几乎可以肯定在后面的测试用例中进行了测试。
标签: python performance kotlin