402. 移掉 K 位数字

题目描述

给了一个字符串百奥是的非负整数num和整数k,问怎么移除其中的k个数字,让剩下的数字最小?

f1-单调栈

基本分析

  1. 怎样的数字是最小的?单调递增排序的
  2. 带有约束k怎么考虑?只要栈非空+栈顶>d+ 还有k就能一直删
  3. k没用完怎么办?字符是单调增的,从后往前删k次(k被维护过)
  4. 结果怎么得到?栈中元素合成字符串,注意前导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"

总结

  1. 这里的栈放的就是最终的结果,是非严格递增,到了删除的情况时,如果k允许就删,删够了后面就无脑加。头部比屁股重要。
posted @   zhangk1988  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示