Next bigger number with the same digits

Cette semaine, c'est Jordan qui vous propose un #KataOfTheWeek : Next bigger number with the same digits

Briefing du Kata : Le but est de créer une fonction qui prend un entier positif en paramètre et retourne l'entier positif supérieur suivant. Cet entier retourné doit être composé des mêmes chiffres que celui fourni en paramètre. Pour example:

12 ==> 21
513 ==> 531
2017 ==> 2071

Si les chiffres ne peuvent pas être réarrangés pour former un plus grand nombre alors on return -1:

9 ==> -1
111 ==> -1
531 ==> -1

Saurez-vous résoudre le problème ?

Bon courage !


Et voici une solution proposée par l'auteur en Kotlin:

fun isNotValid(nbList: Array<String>): Boolean {
    val arrayTmp = nbList.clone()
    arrayTmp.reverse()
    arrayTmp.forEachIndexed { idx, elmt -> if (elmt > arrayTmp[idx + 1]) return false}
    return true
}

fun findFirstSmallestFromRight(nbToList: Array<String>, size: Int): Int {
    var i = size - 1
    while (i > 0) {
        if (nbToList[i] > nbToList[i - 1]) {
            break
        }
        i--
    }
    return i
}

fun swap(ar: Array<String>, i: Int, j: Int) {
    val temp = ar[i]
    ar[i] = ar[j]
    ar[j] = temp
}

fun findFirstSmallestDigitOnRight(min: Int, size: Int, nbToList: Array<String>): Int {
    val x = nbToList[min - 1].toInt()
    for (j in min + 1 until size) {
        if (nbToList[j] > x.toString() && nbToList[j] < nbToList[min]) {
            return j
        }
    }
    return min
}

fun findNext(nb: Long):Long {
    val nbToList = nb.toString().split("").filter { it.isNotEmpty() }.toTypedArray()
    val size = nbToList.size
    val isNotValid = isNotValid(nbToList)

    if (isNotValid) {
        print("Impossible")
        return -1
    }

    val firstSmallest = findFirstSmallestFromRight(nbToList, size)

    val secondSmallest = findFirstSmallestDigitOnRight(firstSmallest, size, nbToList)

    swap(nbToList, firstSmallest - 1, secondSmallest)

    nbToList.sort(firstSmallest, size)
    return nbToList.joinToString(separator = "").toLong()
}

Votre équipe TakiVeille

TakiVeille

TakiVeille