鱼C论坛

 找回密码
 立即注册
查看: 2393|回复: 0

[技术交流] Python 去掉 k 个整数后的最小值(贪心算法1)

[复制链接]
发表于 2020-3-5 14:06:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 一个账号 于 2020-3-14 11:49 编辑

Python 去掉 k 个整数后的最小值


先理解一下要求:

给出一个整数1593212,删掉三个数字,新整数最小的情况是1212(删掉593)

给出一个整数30200,删去一个数字,新整数最小的情况是200.(删掉3,0不能作为数字的首位,也一起删掉)

给出一个整数10,删去两个数字,新整数最小情况是0(删掉1,还剩0,把0删掉,还是0)

思路:

肯定是先降低高位的数字,那怎么降低呢?很简单,

把原整数的所有数字从左到右进行比较,如果发现

某一位的数字大于它右面的数字,那么在删除这个

数字后,必然会使该数位的值降低。

再举个栗子:

给出整数41270936,删除一个数字的最小值是?

是4,因为4是第一个大于右边数字大的数(4>1)

那么再删除一个呢?

因为1<2,2<7,7>0,所以应该删除7!

这里每一步都要求得到删除一个数字后的最小值,经历3次,相当于求出了删除k(k = 3)个数字后的最小值。

像这样依次求得局部最优解,最终得到全局最优解的思想,叫做贪心算法。

代码实现:
def remove_k_digits(num, k):
    num = list(num)
    for i in range(k):
        hasCut = False
        #从左向右遍历,找到比自己右侧数字大的数字并删除它那个数字
        for j in range(len(num)-1):
            if num[j] > num[j+1]:
                num.remove(num[j+1])
                hasCut = True
                break

    #如果没有找到,则删除最后一个数字
    if hasCut == False:
        num.pop()

    #清除整数左侧的数字0
    start = 0
    for j in range(len(num)-1):
        if num[j] != '0':
            break
        start += 1
    num = num[start:len(num)]
    #如果所有数字都被删除了,就返回0
    if len(num) == 0:
        return '0'
    
    return num

print(remove_k_digits('1593212', 3))

当然,这样还不是最佳方案,我们会在下一节继续探讨!

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 17:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表