贪心算法解决删数问题:原理与Python实现
1. 问题背景与需求分析1321删数问题是一个经典的贪心算法练习题主要考察选手对数字特性和贪心策略的理解。题目通常给出一个由数字组成的字符串和一个正整数k要求从中删除k个数字后使剩下的数字组成的新数最小。这个问题在实际中有很多应用场景比如优化存储空间时选择删除哪些冗余数据金融交易中最小化手续费的计算资源分配时如何做出最优取舍我第一次接触这个问题是在准备NOIP比赛时当时就被它简洁描述背后隐藏的巧妙解法所吸引。经过多次练习和教学实践我总结出了一套系统的解题思路和常见错误防范方法。2. 算法思路解析2.1 贪心算法选择解决这个问题的核心在于理解贪心算法的适用性。我们需要在每一步做出局部最优选择最终达到全局最优解。具体到这个题目从左到右遍历数字字符串当发现当前数字比下一个数字大时删除当前数字重复这个过程直到删除k个数字这种策略之所以有效是因为数字的高位对数值大小的影响更大。比如数字132删除3得到的12比删除1得到的32更小。2.2 数据结构选择为了实现这个算法我们需要选择合适的数据结构。经过实践比较我推荐使用栈Stack来实现栈可以帮助我们方便地比较当前元素和前一个元素栈的LIFO特性正好符合我们需要回溯检查的需求栈操作的时间复杂度为O(1)整体算法可以达到O(n)的时间复杂度以下是使用栈的伪代码框架stack [] for digit in num_str: while k 0 and stack and stack[-1] digit: stack.pop() k - 1 stack.append(digit)3. 完整实现与代码解析3.1 Python实现代码def removeKDigits(num: str, k: int) - str: stack [] for digit in num: while k 0 and stack and stack[-1] digit: stack.pop() k - 1 stack.append(digit) # 如果还有剩余的k需要删除 if k 0: stack stack[:-k] # 处理前导零 result .join(stack).lstrip(0) return result if result else 03.2 关键点解析循环条件内层while循环的三个条件缺一不可k 0确保不会删除超过k个数字stack确保栈不为空stack[-1] digit当前数字比下一个数字大时才删除剩余k处理如果遍历完字符串后k仍然大于0说明数字是递增的直接从末尾删除剩余k个数字前导零处理使用lstrip(0)去除前导零同时注意全零情况要返回04. 边界情况与测试用例4.1 常见边界情况全部数字相同11111, k2 → 111递增序列12345, k2 → 123递减序列54321, k2 → 321包含前导零100200, k1 → 00200 → 200删除所有数字123, k3 → 04.2 测试用例设计test_cases [ (1432219, 3, 1219), (10200, 1, 200), (10, 2, 0), (1234567890, 9, 0), (4321, 2, 21), (100, 1, 0), (112, 1, 11) ]5. 算法优化与变种5.1 时间复杂度分析原始算法的时间复杂度是O(n)因为每个数字最多入栈和出栈一次。空间复杂度也是O(n)用于存储栈。5.2 实际应用中的优化提前终止当k减到0时可以直接将剩余数字加入结果无需继续比较双端队列可以使用collections.deque代替list实现的栈在某些情况下性能更好字符串操作对于小规模数据直接操作字符串可能更简单直观5.3 问题变种删除数字使结果最大只需将比较条件改为stack[-1] digit删除特定数字如删除所有0或特定模式的数字带权重的删数每个数字有不同的删除成本需要综合考虑6. 常见错误与调试技巧6.1 新手常见错误忽略前导零没有正确处理像0200这样的情况剩余k处理不当忘记处理遍历结束后k0的情况边界条件遗漏没有考虑k0或k字符串长度的情况数据类型混淆将数字字符串当作数值处理导致前导零丢失6.2 调试建议打印中间结果在循环中加入print语句观察栈的变化小规模测试先用简单例子如123, k1手动验证逐步增加复杂度从简单情况开始逐步增加数字长度和k值使用断言在代码中添加assert检查不变量重要提示在处理字符串数字时始终记住保持字符串类型直到最后避免过早转换为整数导致前导零丢失。7. 教学实践心得在教学过程中我发现学生最容易困惑的是为什么贪心算法在这里适用。我通常用以下方式来解释想象数字字符串是一座山峰我们要删除的是山峰而不是山谷。因为山峰局部最大值的存在会让整体数值变大而我们要的是尽可能小的数。所以应该优先删除这些山峰。另一个实用的教学技巧是让学生手动模拟算法过程。例如对于1432219, k31 → [1]4 (14) → [1,4]3 (43,删除4) → [1,3], k22 (32,删除3) → [1,2], k12 → [1,2,2]1 (21,删除2) → [1,2,1], k09 → [1,2,1,9] 结果1219这种逐步演示能帮助学生直观理解算法的工作原理。

相关新闻

Flutter库鸿蒙化适配实战:anilibria的跨平台优化

Flutter库鸿蒙化适配实战:anilibria的跨平台优化

1. 项目背景与核心价值 作为一名长期深耕跨平台开发领域的工程师,我见证了Flutter生态从萌芽到繁荣的全过程。在这个过程中,anilibria作为一款专注于动漫番剧分发的Flutter三方库,因其高效的媒体处理能力和流畅的用户体验,在开发者…

2026/10/14 12:34:39 阅读更多 →
AI时代工作萎缩的本质:从执行者到AI协作者、守门人、翻译官

AI时代工作萎缩的本质:从执行者到AI协作者、守门人、翻译官

1. “工作萎缩”不是失业预告,而是能力坐标系的剧烈偏移“AI时代职场真相:你的工作没有消失,只是在疯狂‘萎缩’”——这句话刚在某行业社群刷屏时,我正帮一位做了十年行政主管的A同学复盘她的年度述职材料。她指着PPT里“智能会议…

2026/10/14 12:33:38 阅读更多 →
Agent沙箱原理与Daytona落地实践:从隔离到生命周期管理

Agent沙箱原理与Daytona落地实践:从隔离到生命周期管理

1. 为什么 Agent 必须配沙箱:从一次事故说起先讲个真实案例。我认识的一位开发者,在某个内部项目的 Coding Agent 里跑自动化代码生成任务。Agent 很聪明,根据需求自己写了一段 Python 脚本去批量处理文件,逻辑没问题,…

2026/10/14 12:33:38 阅读更多 →

最新新闻

TradeX.dll与Trade.dll接口原理及C#实盘调用指南

TradeX.dll与Trade.dll接口原理及C#实盘调用指南

简介:本资源是面向量化交易开发者与金融系统集成工程师的Trade系列交易接口工具集,整合了经典Trade.dll与新一代TradeX.dll(行情交易二合一)两大技术路线,解决多版本接口分散、兼容性差、开发环境搭建繁琐等实际痛点。…

2026/10/14 15:36:31 阅读更多 →
TrueType字体解析实战:从表目录到字形轮廓的完整拆解

TrueType字体解析实战:从表目录到字形轮廓的完整拆解

简介:这是一份面向字体技术开发者与图形编程爱好者的TrueType格式解析类源码,聚焦于将复杂的TTF字体文件结构封装为可复用的C类,帮助读者在游戏开发、图形设计软件或文本渲染引擎中集成自定义字体处理能力。资源包共2个文件,包含1…

2026/10/14 15:36:31 阅读更多 →
基于OpenCV与pyautogui的屏幕理解与自动控制框架解析

基于OpenCV与pyautogui的屏幕理解与自动控制框架解析

简介:这套基于Python的王者荣耀自动游戏脚本,面向对游戏自动化感兴趣的Python学习者与开发者,聚焦图像识别、界面交互、事件监听、多线程协同及反作弊意识等技术点的综合实战。资源共62个文件、667KB,核心包括6个py源码、8个pyc编…

2026/10/14 15:36:31 阅读更多 →
Java Swing实时粒子系统:可嵌入GUI的烟花动效模块

Java Swing实时粒子系统:可嵌入GUI的烟花动效模块

简介:本资源是一份基于Java实现的轻量级烟花特效完整源码包,面向Java初学者、GUI编程入门者及图形动画兴趣开发者,旨在帮助理解动态视觉效果背后的多线程控制、图形绘制与物理模拟逻辑。压缩包共8个文件(48KB)&#xf…

2026/10/14 15:36:31 阅读更多 →
CMSSW框架入门:从SCRAM到cmsRun的工程解析

CMSSW框架入门:从SCRAM到cmsRun的工程解析

简介:CMSSW(Compact Muon Solenoid Software)是欧洲核子研究组织大型强子对撞机CMS实验的离线数据分析软件框架,面向粒子物理研究人员、高能数据处理开发者及相关专业学生,用于对CMS探测器产生的海量碰撞事件进行读取、…

2026/10/14 15:36:31 阅读更多 →
Sybase多行转一行实战:临时表+自连接实现行转列

Sybase多行转一行实战:临时表+自连接实现行转列

1. 项目概述:Sybase中多行转一行的实战需求与本质理解在某金融系统报表模块的日常维护中,我接手了一个典型的“宽表生成”需求:原始交易明细表里,同一笔订单号(order_id)可能对应多条商品记录,每…

2026/10/14 15:35:29 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →