# level 4:Next bigger number with the same digits(2019-12-02)
###### tags: `Codewars` `python`
You have to create a function that takes a positive integer number and returns the next bigger number formed by the same digits:
<pre>
12 ==> 21
513 ==> 531
2017 ==> 2071
</pre>
If no bigger number can be composed using those digits, return -1:
<pre>
9 ==> -1
111 ==> -1
531 ==> -1
</pre>
my code:
<pre>
def next_bigger(n):
import itertools
numlist = [int(i) for i in str(n)]
newlist = set(list(itertools.permutations(numlist,len(numlist))))
new=[]
for i in newlist:
number=''
for j in i:
number = number+str(j)
new.append(int(number))
if n == max(new):
return -1
else:
return sorted(new)[sorted(new).index(n)+1]
</pre>
計算時間過長~~
修改為:
<pre>
def next_bigger(num):
numlist = [int(i) for i in str(num)]
index_of_replace_num = -1
i = len(numlist) - 1
while i > 0:
if numlist[i] > numlist[i-1]:
index_of_replace_num = i - 1
break
i -= 1
if index_of_replace_num == -1:
return -1
else:
firstlist = numlist[:index_of_replace_num]
replaced_num = numlist[index_of_replace_num]
secondlist = numlist[index_of_replace_num+1:]
new_replaced_num = 9
i = 0
delindex = 0
while i < len(secondlist):
if secondlist[i] > replaced_num and secondlist[i] < new_replaced_num:
new_replaced_num = secondlist[i]
delindex = i
i += 1
secondlist.pop(delindex)
secondlist.append(replaced_num)
firstlist.append(new_replaced_num)
output = firstlist + sorted(secondlist)
return int(''.join(str(x) for x in output))
</pre>