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
'