How to find the smallest number greater than a given number, using the same digits in Scala

1 Answer

0 votes
object NextGreaterNumber {

  /**
    * Finds the smallest number greater than `n`
    * using exactly the same digits.
    *
    * Time Complexity: O(n)
    *   - One pass from right to left to find pivot
    *   - One pass from right to left to find swap candidate
    *   - One reverse of suffix
    * Space Complexity: O(n) for digit array
    */
  def nextGreaterNumber(n: Long): Long = {

    // Convert number to a mutable array of digit characters
    val digits: Array[Char] = n.toString.toCharArray
    val length = digits.length

    // Step 1: Find pivot (first digit from right that is smaller than the next)
    var i = length - 2
    while (i >= 0 && digits(i) >= digits(i + 1)) {
      i -= 1
    }

    // If no pivot found → digits are in descending order → no larger number possible
    if (i < 0) {
      return -1
    }

    // Step 2: Find smallest digit to the right of pivot that is larger than pivot
    var j = length - 1
    while (j > i && digits(j) <= digits(i)) {
      j -= 1
    }

    // Step 3: Swap pivot with that digit
    val temp = digits(i)
    digits(i) = digits(j)
    digits(j) = temp

    // Step 4: Reverse the suffix (everything after pivot)
    var left = i + 1
    var right = length - 1

    while (left < right) {
      val t = digits(left)
      digits(left) = digits(right)
      digits(right) = t
      left += 1
      right -= 1
    }

    // Convert digits back to Long
    digits.mkString.toLong
  }

  def main(args: Array[String]): Unit = {
    println(s"Result: ${nextGreaterNumber(534965)}") // 535469
    println("-----------------------------")
    println(s"Result: ${nextGreaterNumber(111)}")    // -1 (all digits identical)
    println("-----------------------------")
    println(s"Result: ${nextGreaterNumber(7600)}")   // -1 (already the largest)
  }
}



/*
run:

Result: 535469
-----------------------------
Result: -1
-----------------------------
Result: -1

*/

 



answered Mar 25 by avibootz

Related questions

...