01 什么是算法?
规格、步骤、正确性与资源取舍
第 01 题 问题 1
算法与 Python 程序有什么区别?
参考答案
算法描述解题步骤;程序用 Python 等语言实现步骤。
解析
同一算法可以有不同语言、不同实现;语法正确也不能替代算法正确性。
第 02 题 问题 2
设计“返回最大值”接口前,至少说明哪些输入与输出约定?
参考答案
是否允许空输入、元素类型、返回最大值还是位置,以及错误处理。
解析
边界与返回规则属于规格,不应由实现细节偶然决定。
第 03 题 问题 3
把最大值初始设为 0,对 [-5,-2] 会发生什么?
参考答案
可能错误返回 0,正确最大值是 -2。
解析
偷偷假设数据非负;用第一项初始化并明确处理空输入。
第 04 题 问题 4
逐项求最大值处理完前 k 项后,应维护什么不变式?
参考答案
best 是前 k 项中的最大值。
解析
初始化成立,每次更新后保持,结束时 k=n 得到整体最大值。
第 05 题 问题 5
非空 n 项列表求最大值,键比较多少次?
参考答案
n−1 次。
解析
第一项用于初始化,后面每项与当前 best 比一次。
第 06 题 问题 6
教材 maximum 与 maximum_indexed 都是 O(n) 时间,额外空间一样吗?
参考答案
不一样:切片版本 O(n),下标版本 O(1)。
解析
values[1:] 创建新列表;分析 Python 代码需计入切片。
第 07 题 问题 7
“测试十个输入都正确,因此已证明全部输入正确”对吗?
参考答案
不对。
解析
有限测试可发现反例;完整证明需要基于规格和不变式等推理。
第 08 题 问题 8
反复按姓名搜索,何时建立字典索引可能值得?
参考答案
查询很多次且数据维护成本可接受时。
解析
要算建立 O(n) 时间、O(n) 空间和后续查询/更新,不能只看一次平均查询。
第 09 题 问题 9
建立姓名到记录的 dict 时,重复姓名有什么风险?
参考答案
后面的记录会覆盖同键旧记录。
解析
要约定唯一键、保留多条还是拒绝重复;这是业务规则。
第 10 题 问题 10
二分循环每次不缩小候选范围,可能有什么问题?
参考答案
可能无限循环。
解析
算法要取得进展;更新 low/high 时应排除已经比较的 mid。
第 11 题 问题 11
速度更快但内存超预算的算法一定更适合吗?
参考答案
不一定。
解析
正确性、时间和空间约束共同决定选择,不能只比最快秒数。
第 12 题 问题 12
已经有现成排序库,学习排序原理还有什么实际价值?
参考答案
理解前提、复杂度、稳定性、空间和适用边界。
解析
通常仍可使用可靠组件;懂原理帮助选择、调试和判断何时需要外部排序。