Software Engineering

# Get the next biggest number with the same digits using Python

## The challenge#

Create a function that takes a positive integer and returns the next bigger number that can be formed by rearranging its digits. For example:

``````12 ==> 21
513 ==> 531
2017 ==> 2071
``````
``````nextBigger(num: 12)   # returns 21
nextBigger(num: 513)  # returns 531
nextBigger(num: 2017) # returns 2071
``````

If the digits can’t be rearranged to form a bigger number, return `-1` (or `nil` in Swift):

``````9 ==> -1
111 ==> -1
531 ==> -1
``````
``````nextBigger(num: 9)   # returns nil
nextBigger(num: 111) # returns nil
nextBigger(num: 531) # returns nil
``````

## Test cases#

``````Test.assert_equals(next_bigger(12),21)
Test.assert_equals(next_bigger(513),531)
Test.assert_equals(next_bigger(2017),2071)
Test.assert_equals(next_bigger(414),441)
Test.assert_equals(next_bigger(144),414)
``````

## The solution in Python#

``````def next_bigger(n):
# create a list representation of the input integer
arr = list(str(n))

# sort in reverse to get the largest possible number
max_n = int("".join(sorted(arr, reverse=True)))

# sort to get the minimum number
min_n = sorted(arr)

# copy the input to a new variable
m = n

# loop while less than or equal to the max
while m <= max_n:
# increment our number
m += 1
# if found in our min list
if sorted(list(str(m))) == min_n:
# return the new number
return m

# if all else fails, return -1
return -1
``````

## An alternative#

``````def next_bigger(n):
# if the number is the same as the reverse
if str(n) == ''.join(sorted(str(n))[::-1]):
# return -1 as it doesn't change
return -1

# keep a new temp variable
a = n

# loop forever
while True:
# increment the number
a += 1

# we have a match!
if sorted(str(a)) == sorted(str(n)):