Tech Interview Handbook 数学题 Cheat Sheet:面试中数学技巧、边界陷阱与快算算子实现
本篇基于 math.md 整理,覆盖 Tech Interview Handbook 算法专题中"数学(Math)"这一附加主题的核心内容:面试时需警惕的三类陷阱、必背的常用公式表、取模/浮点比较/快速算子三大技巧,以及配套的必刷题目清单。读完本篇,你将知道如何在编码面试中正确处理除零、溢出、负数与浮点边界,并能用"倍增(快速幂)""减半(二分)"两类思路把幂、平方根、除法等算子做到 O(log n) 级别。
数学题在编码面试中的定位
数学是计算机科学的基础,任何程序员都需要具备基本的数学素养。原文档在 Introduction 一节明确指出:就编码面试而言,通常不会涉及大量数学,但掌握一些基础数学技巧很有帮助,因为面试官可能会要求你手动实现某些数学运算。
从仓库结构看,该文档是"Algorithms study cheatsheets"专题下的一篇学习指南。在 sidebars.js 中,algorithms/math 与 dynamic-programming、binary、geometry 一起被归入 Additional 类别——即相对数组、字符串等高频主题之外、值得额外准备的加分项。按 study-cheatsheet.md 的说明,每篇专题指南都遵循统一骨架:概述、面试注意事项、Corner cases、实用技巧、必备题目与推荐练习题,本文的章节结构也据此展开。
面试中需要警惕的三类陷阱
原文档"Things to look out for during interviews"一节给出了三条核心原则,这里完整继承并补充说明:
-
涉及除法或取模时,检查除以 0 的情况。 这是最常见的崩溃点。例如手写除法语义的函数(见后文 Sqrt(x)、Pow(x, n) 一类题目)时,除数在迭代过程中可能归零或参数本身可能为 0。
-
使用 Java、C++ 等强类型语言时,检查溢出/下溢(overflow/underflow)。 原文档给出的务实建议是:至少主动提及"溢出/下溢是可能的",并询问面试官是否需要处理。在面试中主动点出这类问题本身就是加分项。一个直观的例子是二分法中计算中点的写法——仓库内 binarySearch.js 使用的是:
const mid = left + Math.floor((right - left) / 2);而非
Math.floor((left + right) / 2)。在 C++ 等语言中,后者在left + right超过INT_MAX时就会溢出,前者的"先做差再减半"写法正是规避溢出的标准手法。 -
考虑负数与浮点数。 听起来显然,但原文档提醒:在面试压力下,很多显而易见的情形会被忽略。仓库中的示例代码恰好印证了这一点——intToBin.js 与 binToInt.js 的文件头注释都明确写着 "Does not handle negative numbers",说明即便是工具级实现,也常把"负数"作为明确的适用范围限制来处理。
Corner cases 清单
原文档列出的四个边界情形,应作为数学题代码提交前的自查清单:
- Division by 0(除以 0)
- Multiplication by 1(乘以 1)
- Negative numbers(负数)
- Floats(浮点数)
以二分查找为例,仓库内的实现就体现了边界处理的重要性:JavaScript 版本 binarySearch.js 在循环条件上采用 while (left <= right)(含等号,保证单元素区间也能被检查),且对"target 不存在"统一返回 -1;文件末尾的 9 条自测覆盖了命中各区、小于首元素(0)、大于末元素(11)等场景。Python 版本 binary_search.py 则更进一步,给出了 bisect_left / bisect_right 两个变体,其中 while left < right(左闭右开)的区间约定与上面含等号的写法形成对照——理解这类区间约定,正是"负数、浮点之外"的另一类数学题边界。
常用公式速查表
原文档"Common formulas"表格是本页最核心的速查资产,完整继承如下:
| 用途 | 公式 |
|---|---|
| 判断一个数是否为偶数 | num % 2 == 0 |
| 1 到 N 的求和 | 1 + 2 + ... + (N - 1) + N = (N+1) * N / 2 |
| 等比数列求和 | 20 + 21 + 22 + 23 + ... + 2n = 2n+1 - 1 |
| N 的排列数 | N! / (N-K)! |
| N 的组合数 | N! / (K! * (N-K)!) |
几点使用提示:
- 偶数判断在强类型语言里对负数同样成立(如
-4 % 2 == 0),这与"Corner cases"中的负数项呼应; - 前 N 项求和与等比数列求和在面试中常用于 O(1) 推导前缀、或解释指数级规模(2n+1 - 1 即 n 位二进制能表示的非负整数个数减 1);
- 排列/组合公式在估算方案数、设计题中做规模论证时非常有用,但注意阶乘增长极快,涉及大数时应改用取模或对数形式,避免上文提到的溢出问题。
三大实用技巧
技巧一:判断"X 的倍数"用取模
原文档指出:当题目涉及"某数是否为 X 的倍数"时,取模运算符 % 是最直接的工具。这与公式表中的偶数判断是同一思路的推广——例如"能否被 3 整除""闰年判断(能否被 4/100/400 整除)"都归约到取模运算。配合"警惕除以 0"的原则:取模运算中除数同样不能为 0。
技巧二:浮点数比较用 epsilon
原文档强调:处理浮点数时,要留意舍入误差(rounding mistakes),应使用 epsilon 比较代替相等判断,例如用 abs(x - y) <= 1e-6 代替 x == y。这在"判断两点是否重合""判断线段是否共线/相交"等几何与数学混合题中尤为关键——两次不同的运算路径得到的浮点结果可能相差 1e-9 量级,直接 == 会误判。
技巧三:比 O(n) 更快的算子实现——倍增与减半
原文档指出:如果题目要求实现幂、平方根、除法等算子,并希望快于 O(n),倍增(fast exponentiation)或减半(binary search)是通常的解法,对应题目为 Pow(x, n) 与 Sqrt(x)。仓库中的工具代码正好提供了"减半"思想的两个现成样本:
-
二分查找(减半搜索):见上文 binarySearch.js 与 binary_search.py。每次迭代将搜索区间减半,得到 O(log n) 的查找;
-
重复除 2 转二进制(减半分解):intToBin.js 通过循环执行
number % 2(取最低位)与parseInt(number / 2, 10)(减半)完成十进制到二进制的转换:function intToBin(number) { if (number === 0) { return '0'; } let res = ''; while (number > 0) { res = String(number % 2) + res; number = parseInt(number / 2, 10); } return res; }其反向操作 binToInt.js 使用逐位
res = res * 2 + digit完成二进制到十进制的还原,两个函数互为镜像,且文件末尾均附带与内建函数(toString(2)/parseInt(..., 2))对齐的自测断言,是理解"按位减半/倍增"思想的极简范例。
对 Sqrt(x) 这类题,减半思路可直接套用为在 [0, x] 上二分"最大的满足 mid² ≤ x 的整数";对 Pow(x, n),倍增思路即快速幂:每次平方底数、指数减半,把 O(n) 连乘压到 O(log n)。
必备题目与推荐练习题
原文档将题目分为两档:
Essential questions(必备题)——学习该主题时应当练习的核心题:
- Pow(x, n)
- Sqrt(x)
Recommended practice questions(推荐练习题)——学完必备题之后的进阶练习:
- Integer to English Words(整数转英文单词)
其中前两题恰好分别对应"技巧三"中的倍增与减半两条路线,第三题则把"按位/按段分解"的数学思维应用到数字与字符串的映射上,三者共同构成该主题的最小练习闭环。
推荐学习资源
原文档末尾通过 AlgorithmCourses.md 组件统一引入算法课程推荐,该共享文件被算法专题各篇(包括本篇)复用,推荐了三门课程:
- AlgoMonster——由 Google 工程师打造,采用数据驱动方式教授高频题型模式,强调最短时间通过技术面试,一次性付费、终身访问;
- Grokking the Coding Interview: Patterns for Coding Questions(Design Gurus)——从"题型模式(pattern)"视角组织练习,支持 Java、Python、C++、JavaScript,并提供分步可视化,理念是"学习理解模式,而非背答案";
- Master the Coding Interview: Data Structures + Algorithms(Udemy)——约 19 小时内容,除编码外还覆盖简历、非技术面试与薪酬谈判,编码演示使用 JavaScript。
延伸阅读
- 专题总入口与各指南的统一结构说明:study-cheatsheet.md
- 与数学题强相关的仓库内参考实现:binarySearch.js、binary_search.py、intToBin.js、binToInt.js
- 相邻专题(同为 Additional 类别):binary.md、geometry.md、dynamic-programming.md
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00