当前位置: 首页 > news >正文

从哈工大数据结构期末算法题出发:手把手教你用Python实现“删K位得最小数”和“二叉树最长路径”

从算法题到实战:Python实现“删K位最小数”与“二叉树最长路径”全解析

当数据结构从试卷走向代码编辑器,抽象的理论突然变得具体而生动。本文将带你用Python实现两道经典算法题:"删K位得最小数"和"二叉树最长路径",不仅还原解题思路,更注重工程实践中的各种细节处理。

1. 删K位数字问题:贪心算法的精妙应用

"给定一个数字字符串,删除其中K个字符后使剩余数字最小"——这道看似简单的题目背后隐藏着贪心算法的典型应用场景。想象一下信用卡号输入错误需要删除几位数字的场景,或者文件版本号需要精简时的处理逻辑。

1.1 问题分析与核心思路

贪心算法的关键在于局部最优导致全局最优。对于数字"1432219"要删除3位,我们不应该随机删除,而是从左到右寻找应该删除的数字:

  1. 维护一个结果栈
  2. 遍历每个数字时,只要当前数字比栈顶小且还能删除(k>0),就弹出栈顶
  3. 将当前数字压入栈
  4. 如果遍历完k仍大于0,从末尾继续删除
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) # 处理剩余需要删除的情况 final_stack = stack[:-k] if k > 0 else stack # 去除前导零并处理空字符串情况 return ''.join(final_stack).lstrip('0') or '0'

1.2 边界情况与测试用例

实际编码时需要特别注意以下边界条件:

测试用例预期结果说明
"10200", 1"200"删除1后需去除前导零
"10", 2"0"全部删除应返回0
"12345", 2"123"单调递增时删除末尾
"10001", 4"0"多个零的特殊处理

提示:在实际面试中,能正确处理各种边界情况往往比算法本身更重要

2. 二叉树最长路径:递归与迭代的双解

二叉树的最大深度问题看似简单,但当需要获取具体路径而非仅长度时,复杂度就显著提升。这在文件系统路径查找、组织架构层级分析等场景都有实际应用。

2.1 递归解法:深度优先的直观实现

递归是解决树问题的自然思路,后序遍历可以优雅地获取深度信息:

class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def longestPath(root: TreeNode) -> List[int]: max_path = [] def dfs(node): nonlocal max_path if not node: return [] left_path = dfs(node.left) right_path = dfs(node.right) # 选择更长的子路径 longer_path = left_path if len(left_path) > len(right_path) else right_path current_path = longer_path + [node.val] # 更新全局最长路径 if len(current_path) > len(max_path): max_path = current_path return current_path dfs(root) return max_path

2.2 迭代解法:显式栈管理状态

对于大型树或担心递归栈溢出的情况,迭代解法更可靠:

def longestPathIterative(root: TreeNode) -> List[int]: if not root: return [] stack = [(root, [root.val])] max_path = [] while stack: node, path = stack.pop() if len(path) > len(max_path): max_path = path if node.right: stack.append((node.right, path + [node.right.val])) if node.left: stack.append((node.left, path + [node.left.val])) return max_path

两种方法各有优劣:

  • 递归:代码简洁,但深度过大可能栈溢出
  • 迭代:性能稳定,适合大规模数据,但代码稍复杂

3. 算法优化与性能对比

理解算法的时间空间复杂度是工程实现的关键环节。

3.1 删K位算法复杂度分析

  • 时间复杂度:O(n),每个元素最多入栈出栈一次
  • 空间复杂度:O(n),最坏情况需要存储整个字符串

优化点:

  • 提前终止:当剩余需要删除的数字数等于剩余未处理数字数时直接处理
  • 并行处理:超长字符串可分块处理

3.2 二叉树路径算法对比

方法时间复杂度空间复杂度适用场景
递归O(n)O(h)树高度适中
迭代O(n)O(n)树特别深或不确定深度

4. 实际应用场景扩展

这两个算法看似学术,实则有着广泛的实际应用:

删K位数字的应用场景

  • 数据压缩:去除冗余数字
  • 金融交易:处理输错的金额
  • 版本控制:精简过长的版本号

二叉树最长路径的应用

  • 文件系统:查找最深嵌套目录
  • 网络路由:寻找最长匹配路径
  • 组织结构:分析最长汇报链

在实现这些业务逻辑时,我们往往需要对基础算法进行适当改造。例如文件系统路径查找可能需要同时记录路径字符串而非仅长度,这时算法框架不变,只需调整存储的信息类型。

http://www.jsqmd.com/news/517699/

相关文章:

  • 安卓7.0系统深度解锁:安全获取Root权限的实用指南
  • 72×40 OLED轻量库:SSD1315驱动与I²C高效显存优化
  • 【最全】2026年3月OpenClaw(Clawdbot)腾讯云10分钟喂饭级搭建指南
  • SOONet模型与卷积神经网络(CNN)特征提取器的协同优化
  • 5分钟搞定Microchip dsPIC33串口通信:MCC配置全流程+避坑指南
  • 腾讯AI Lab的WebVoyager如何像真人一样浏览网页?多模态Agent实战解析
  • Stable Audio Open:ComfyUI中的游戏音效革命
  • Edge浏览器安装Vue DevTools保姆级教程(含常见问题解决)
  • 电磁场与电磁波 核心公式解析与应用指南
  • QGIS地图下载避坑指南:如何用XYZ Tiles精准导出0.3米分辨率地图(附CRS设置技巧)
  • Vue3实战:高德地图离线化部署全攻略——从瓦片下载到内网集成
  • Pi0 VLA模型实战落地:某新能源车企电池模组装配线VLA质检系统上线
  • ollama-QwQ-32B领域适配实战:优化OpenClaw医疗文本处理
  • HC-04蓝牙模块双模通信实战指南
  • Ubuntu 20.04编译Ceres 2.2.0:从依赖配置到CUDA加速的完整指南
  • 为什么现代网络离不开MPLS?深入解析标签交换与IP转发的性能差异
  • 8D分析总做形式化报告?一文吃透问题根治的标准化闭环
  • 从“能源心脏”到系统基石:RK809-5 PMIC的硬件设计与Android驱动集成全解析
  • OpenClaw版本升级:Qwen3-32B兼容性测试与回滚方案
  • 2026南京军用电源市场:哪些厂商值得选择,目前军用电源分析优选实力品牌 - 品牌推荐师
  • API 网关在海淘系统中的实践应用
  • 橡塑板2026新分析:口碑厂商引领市场,国内热门的橡塑板分析精选实力品牌 - 品牌推荐师
  • 从零搭建一个AUTOSAR软件组件:手把手教你定义和使用AUTOSAR接口(含ARXML配置)
  • 科哥cv_unet图像抠图WebUI:一键批量抠图,电商设计效率翻倍
  • 离散数学实战:5分钟掌握配凑法求解主析取范式(附常见错误分析)
  • AI Agent工程化怎么落地?OpenClaw架构深度解析(非常详细),稳扎稳打必看,收藏这一篇就够了!
  • 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载!
  • 嵌入式软件架构设计:资源约束与实时性驱动的工程实践
  • Boss直聘爬虫进阶:如何用Selenium无头模式+动态URL绕过反爬(Python3.8实测)
  • 如何构建自主可控的知识管理系统:Obsidian图片本地化全攻略