培训学案算法贪心数字问题.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

删除数字问题:

有1个数字,现在要删除k个数字,要使删除后的数字最小,问如何求解。

例子:

输入1236542

输出1234

解析:

这个问题我们使用贪心算法来解决,我们先把问题化简成下面几个小问题,在利用贪心

的策略一一解决(以123654为例):

1.123456删除一个数字得到的值怎样最小?

2.上一个问题的结果再删除一个数字得到的值怎样最小?...n.删除数字达到k个,结束程

我们来探究第一个小问题,如何删除一个数字使剩下的数字最小?

很多人第一个想到的或许是删除最大的数字,但真的是这样吗?我们不妨试试:

乍一看没啥问题,但是我们想想,如果去掉5,结果却比这个更小:34126

我们再来看一组数据:

如果去掉的不是9而是7的话,结果就不一样了:16892

发现这两个数的共同点了吗?对了,就是“要删除的数的后一位一定比要删除的数大”,

如果用a[x]来表示要被删除的数的话:

a[x+1]a[x]

那么以此类推,我们就能解决下面的小问题了。

代码如下:

deftanxin(num,k):

num=str(num)

foriinrange(k):

forjinrange(len(num)-1):

ifnum[j]num[j+1]andnum[j+1]!=0:

num=num[:j]+num[j+1:]

break#如果没有数字满足条件就删除最后一位

else:

num=num[:-1]

ifnum:

returnint(num)

else:

return0

其实上面这段代码还有一个优化,他巧妙地利用了栈的特性:

FILO先入先出

我们可以利用pop出栈来模拟删除数字,用push(append)入栈来模拟遍历数字:

deftanxin_2(num,k):

num=str(num)

length=len(num)-k

stack=[]

foriinrange(len(num)):

c=num[i]

whilelen(stack)0andstack[len(stack)-1]candk0:

stack.pop()

k-=1

stack.append(c)

whilelen(stack)!=length:

stack=stack[:-1]

ifstack:

returnint(.join(stack))

else:

return0

当遍历到的数字比栈顶的数字大的时候,栈顶数字出栈。

上面两个函数运行效果分别如下:

a=[12345,54

文档评论(0)

huang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档