How to find the smallest number greater than a given number, using the same digits in VB.NET

1 Answer

0 votes
Imports System

Public Class NextGreaterNumberFinder

    ' 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

    Public Shared Function NextGreaterNumber(n As Long) As Long
        ' Convert number to array of characters (digits)
        Dim digits As Char() = n.ToString().ToCharArray()
        Dim length As Integer = digits.Length

        ' Step 1: Find pivot (first digit from right that is smaller than the next)
        Dim i As Integer = length - 2
        While i >= 0 AndAlso digits(i) >= digits(i + 1)
            i -= 1
        End While

        ' If no pivot found → digits are in descending order → no larger number possible
        If i < 0 Then
            Return -1
        End If

        ' Step 2: Find smallest digit to the right of pivot that is larger than pivot
        Dim j As Integer = length - 1
        While j > i AndAlso digits(j) <= digits(i)
            j -= 1
        End While

        ' Step 3: Swap pivot with that digit
        Dim temp As Char = digits(i)
        digits(i) = digits(j)
        digits(j) = temp

        ' Step 4: Reverse the suffix (everything after pivot)
        Dim left As Integer = i + 1
        Dim right As Integer = length - 1

        While left < right
            Dim t As Char = digits(left)
            digits(left) = digits(right)
            digits(right) = t
            left += 1
            right -= 1
        End While

        ' Convert char array back to Long
        Dim result As Long = 0
        For Each c As Char In digits
            result = result * 10 + (Convert.ToInt32(c) - Convert.ToInt32("0"c))
        Next

        Return result
    End Function

End Class


Module Program
    Sub Main()
        Console.WriteLine("Result: " & NextGreaterNumberFinder.NextGreaterNumber(534965)) ' 535469
        Console.WriteLine("-----------------------------")
        Console.WriteLine("Result: " & NextGreaterNumberFinder.NextGreaterNumber(111))    ' -1 (all digits identical)
        Console.WriteLine("-----------------------------")
        Console.WriteLine("Result: " & NextGreaterNumberFinder.NextGreaterNumber(7600))   ' -1 (already the largest)
    End Sub
End Module




' run:
'
' Result: 535469
' -----------------------------
' Result: -1
' -----------------------------
' Result: -1
'

 



answered Mar 25 by avibootz

Related questions

...