题目描述
给了一个字符串百奥是的非负整数num和整数k,问怎么移除其中的k个数字,让剩下的数字最小?
基本分析
- 怎样的数字是最小的?单调递增排序的
- 带有约束k怎么考虑?只要栈非空+栈顶>d+ 还有k就能一直删
- k没用完怎么办?字符是单调增的,从后往前删k次(k被维护过)
- 结果怎么得到?栈中元素合成字符串,注意前导0和""情况
代码
| class Solution: |
| def removeKdigits(self, num: str, k: int) -> str: |
| st = [] |
| for i, d in enumerate(num): |
| while st and k and st[-1] > d: |
| st.pop() |
| k -= 1 |
| st.append(d) |
| |
| for _ in range(k): |
| if st: |
| st.pop() |
| # 注意k没用完的情况 |
| ans = "".join(st).lstrip('0') |
| if ans != "": |
| return ans |
| else: |
| return "0" |
总结
- 这里的栈放的就是最终的结果,是非严格递增,到了删除的情况时,如果k允许就删,删够了后面就无脑加。头部比屁股重要。
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现