简体   繁体   English

下一个具有相同数字的最大数字

[英]next biggest number with same digits

my code seems right, but i need it to return -1 if no bigger number can be generated:我的代码似乎是正确的,但如果不能生成更大的数字,我需要它返回 -1:

def next_bigger(n):
    strNum = str(n)
    length = len(strNum)
    for i in range(length-2, -1, -1):
        current = strNum[i]
        right = strNum[i+1]
        if current < right:
            temp = sorted(strNum[i:])
            next = temp[temp.index(current) + 1]
            temp.remove(next)
            temp = ''.join(temp)    
            return int(strNum[:i] + next + temp)
        else: 
            return -1
    return n

My attempt to solve this isn't working: adding the else is what I percevied to be the alternative to when current is greater than right .我试图解决这个问题是行不通的:添加else是我认为current大于right时的替代方法。

Please help!请帮忙!

Anyway, the flow of your code is wrong: in your loop, you have the following structure:无论如何,您的代码流程是错误的:在您的循环中,您具有以下结构:

for A :
    if B :
        return
    else :
        return

So your program will always terminate before a second iteration.所以你的程序总是会在第二次迭代之前终止。

In some cases fixing the code is much harder than rewritting it.在某些情况下,修复代码比重写代码要困难得多。 I am not sure of how much help this is to you but try the following code.我不确定这对您有多大帮助,但请尝试以下代码。

def next_bigger(n):
    str_num = str(n)
    size = len(str_num)
    for i in range(2, size + 1):
        sublist = list(str_num[-i:size])
        temp = sorted(sublist, reverse=True)
        if sublist != temp:
            return int(str_num[:size-i] + ''.join(temp))
    return -1

What it does is that it slices the number from the back (starting with 2 element slices and going on up to len ) and checks to see if the generated slice produces the biggest number possible when joined .它的作用是从后面对数字进行切片(从 2 个元素切片开始,一直到len )并检查生成的切片是否在 join 时产生最大的数字 If not it gets replaced with the next bigger and returns it.如果不是,它将被下一个更大的替换并返回。 Let me know if this worked for you.如果这对你有用,请告诉我。


EXAMPLE例子

n = 4181536841

sublist = ['4', '1']
temp = ['4', '1']  # they are the same so no larger number can be produced just by looking at a slice of length 2.

#---------iteration 2---------------
sublist = ['8', '4', '1']
temp = ['8', '4', '1']  # they are again the same so no larger number can be produced just by looking at a slice of length 3.

#---------iteration 3---------------
sublist = ['6', '8', '4', '1']
temp = ['8', '6', '4', '1']  # now they are different. So produce a number out of temp (8641) ans stich it to the rest of the number (418153)
return 4181538641

Ev. EV。 Kounis is wrong.库尼斯错了。 In eg next biggest after 4181536841 is 4181538146, not 4181538641.例如,在 4181536841 之后的下一个最大的是 4181538146,而不是 4181538641。

Logic works like this:逻辑是这样工作的:

1 - Find where list[-n] > list[-n - 1]
2 - find next number higher than list[-n] after list[-n]
3 - Switch next highest and list[-n - 1]
4 - reorder the remaining numbers after list[-n] from low to high

e.g. 29357632:
1 - list[-n] = 7 --> 2935[7]632
    since 7 > 5

2 - next highest number after list[-n] (7) is the 6 --> 29357[6]32

3 - switch list[-n-1] and next highest number (switch 5 and 6) --> 
293[6]7[5]32

4 - reorder rest of digits after list[-n-1] (6) --> 2936[7532] > 29362357

so next highest number after 29357632 is 29362357所以 29357632 之后的下一个最高数字是 29362357

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM