首页 > 解决方案 > 为什么这些 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(). 代码不再在任何测试用例上超时,但在所有大型测试用例上仍然失败

标签: pythonperformancekotlin

解决方案


我可以在这里看到三个问题。我现在会为你指出正确的方向。

  1. Python 和 Kotlin 每次都复制数组。这可能是也可能不是问题。您有多达一百万个元素,每个元素只复制一次。如果这超出了您的时间限制,我会感到惊讶,但它可能会这样做。看起来你可以避免使用.subList().

  2. 看起来您将剩余的物品当作自己的垃圾箱一样对待。但是这个 bin 比 m 小,这是不允许的。检查这是否真的是您想要的。

  3. Kotlin Ints 是 32 位有符号整数。在溢出之前,您最多只能存储大约 20 亿个数字。你需要避免这种情况!看看这些限制——你可以拥有多达一百万种产品,每个产品的价值高达十亿。(这与 Python 整数不同,它永远不会溢出,因此总是会给出正确的答案,但如果您尝试对非常大的数字进行操作,可能会占用大量内存并减慢速度,这很可能会导致您的程序超时。)这里有一个提示:(a + b) % n等于((a % n) + (b % n)) % n


推荐阅读