LeetCode in Kotlin

1850. Minimum Adjacent Swaps to Reach the Kth Smallest Number

Medium

You are given a string num, representing a large integer, and an integer k.

We call some integer wonderful if it is a permutation of the digits in num and is greater in value than num. There can be many wonderful integers. However, we only care about the smallest-valued ones.

Return the minimum number of adjacent digit swaps that needs to be applied to num to reach the kth smallest wonderful integer.

The tests are generated in such a way that kth smallest wonderful integer exists.

Example 1:

Input: num = “5489355142”, k = 4

Output: 2

Explanation: The 4th smallest wonderful number is “5489355421”. To get this number:

Example 2:

Input: num = “11112”, k = 4

Output: 4

Explanation: The 4th smallest wonderful number is “21111”. To get this number:

Example 3:

Input: num = “00123”, k = 1

Output: 1

Explanation: The 1st smallest wonderful number is “00132”. To get this number:

Constraints:

Solution

@Suppress("NAME_SHADOWING")
class Solution {
    fun getMinSwaps(num: String, k: Int): Int {
        var k = k
        val result = num.toCharArray()
        while (--k >= 0) {
            var swap = result.size - 2
            while (swap >= 0 && result[swap] >= result[swap + 1]) {
                --swap
            }
            var pair = result.size - 1
            while (pair > swap && result[swap] >= result[pair]) {
                --pair
            }
            swap(result, swap, pair)
            var lo = swap + 1
            var hi = result.size - 1
            while (lo < hi) {
                swap(result, lo++, hi--)
            }
        }
        var ans = 0
        val arr = num.toCharArray()
        for (i in arr.indices) {
            if (arr[i] == result[i]) {
                continue
            }
            var j = i
            while (arr[i] != result[j]) {
                ++j
            }
            ans += j - i
            while (--j >= i) {
                swap(result, j, j + 1)
            }
        }
        return ans
    }

    private fun swap(arr: CharArray, a: Int, b: Int) {
        val tmp = arr[a]
        arr[a] = arr[b]
        arr[b] = tmp
    }
}