https://leetcode.com/problems/relative-ranks Easy

Решение

class Solution {
    fun findRelativeRanks(score: IntArray): Array<String> {
        val n = score.size
        val idx = IntArray(n) { it }
        fun swap(i: Int, j: Int) { val t = idx[i]; idx[i] = idx[j]; idx[j] = t }
        fun part(l: Int, r: Int): Int {
            val p = score[idx[(l + r) ushr 1]]
            var i = l
            var j = r
            while (i <= j) {
                while (score[idx[i]] > p) i++
                while (score[idx[j]] < p) j--
                if (i <= j) { swap(i, j); i++; j-- }
            }
            return i
        }
        var a = 0
        var b = n - 1
        val st = IntArray(64)
        var top = 0
        while (true) {
            if (a < b) {
                val m = part(a, b)
                if (m - a < b - m) {
                    if (m < b) { st[top++] = m; st[top++] = b }
                    b = m - 1
                } else {
                    if (a < m - 1) { st[top++] = a; st[top++] = m - 1 }
                    a = m
                }
            } else {
                if (top == 0) break
                b = st[--top]
                a = st[--top]
            }
        }
        val res = Array(n) { "" }
        var i = 0
        while (i < n) {
            val rank = i + 1
            res[idx[i]] = when (rank) {
                1 -> "Gold Medal"
                2 -> "Silver Medal"
                3 -> "Bronze Medal"
                else -> rank.toString()
            }
            i++
        }
        return res
    }
}