- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 2024-2025学年下学期高中英语选修一第三单元A卷.docx VIP
- 淡水鱼深加工项目可行性研究报告.docx VIP
- 老年患者髋部骨折围手术期麻醉管理.pptx VIP
- 深圳市房屋建筑工程施工图设计文件监督抽查常见问题汇编(第2版).docx
- 美国微机保护装置SEL-351A使用手册_20001006.pdf VIP
- 基于计算机视觉的舌体多特征识别与裂纹舌量化评估体系构建.docx
- 2025年广东省基层住院医师线上岗位培训(口腔学)《牙体牙髓病》专业课答案(5).docx
- 2025-2030中国红糖行业市场运行态势及发展趋势与投资预测研究报告.docx
- 欧姆定律基础练习题.pdf VIP
- 2018年-2020年托业考试语法考点全汇总.pdf VIP
文档评论(0)