繁体   English   中英

使用递归进行 K 次交换后的最大数量

[英]Maximum number after K swaps using recursion

我必须制作一个 function 最大化(x,k),其中 x 是 integer,k 是最大交换次数,output 是最大交换次数后的最大次数。 还要使用两个函数 swap(s,i,j) 和 sort(s),顾名思义,它们根据索引交换字符串的字符,并分别从高到低排序。 我尝试过,但如果没有另一个变量 i 在最大化 function 中,我就无法做到这一点。 有没有什么办法可以通过传递两个变量 x 和 k 来完成最大化 function 中的变量 i。 这是我的代码:

def swap(s,i,j):
    return s[0:i]+s[j]+s[i+1:j]+s[i]+s[j+1:len(s)]

def sort(s):
    return "".join((sorted(s)[::-1]))

def maximize(x,k,i):
    if k==0 or i==len(str(x)):
        return x

    s=str(x)
    t=sort(s)

    if t[i]>s[i]:
        j=s.find(t[i],i,len(s))
        s=swap(s,i,j)
        return maximize(int(s),k-1,i+1)
    else:
        return maximize(int(s),k,i+1)

print(maximize(223953,2,0))

要获得尽可能高的数字,您需要预先设置最大的数字。 这意味着每一层递归都可以专注于放置第一个数字,并依靠下一层来交换剩余的数字。

def swap(s,i,j):
    return s[0:i]+s[j]+s[i+1:j]+s[i]+s[j+1:len(s)]

def sort(s):
    return "".join((sorted(s)[::-1]))

def maximize(x,k):
    if not k or x<10: return x   # stop when no more swaps or no more digits
    s = str(x)
    if s == sort(s): return x    # stop if already at max value
    i = s.index(max(s))          # find position of highest digit
    if i>0: s = swap(s,0,i)      # swap if not already first
    suffix = maximize(int(s[1:]),k - (i>0)) # recurse for rest of digits (don't reduce swap count if no swap done)
    return int(s[0]+str(suffix)) # combine biggest digit with maximized remainder

print(maximize(223953,2)) # 953223

暂无
暂无

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

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