Skip to content

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
Code language: Python (python)
nextBigger(num: 12) # returns 21 nextBigger(num: 513) # returns 531 nextBigger(num: 2017) # returns 2071
Code language: Python (python)

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

9 ==> -1 111 ==> -1 531 ==> -1
Code language: PHP (php)
nextBigger(num: 9) # returns nil nextBigger(num: 111) # returns nil nextBigger(num: 531) # returns nil
Code language: Python (python)

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)
Code language: Python (python)

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
Code language: Python (python)

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)): # return the answer! return a
Code language: Python (python)

See also  How to Find the Longest Substring in Alphabetical Order in Python
Notify of
1 Comment
Oldest Most Voted
Inline Feedbacks
View all comments
9 months ago

This is a brute force effort which will fail the Codewars test if anyone else is interested. Not very elegant.

Would love your thoughts, please comment.x