首页
/ Tech Interview Handbook 数学题 Cheat Sheet:面试中数学技巧、边界陷阱与快算算子实现

Tech Interview Handbook 数学题 Cheat Sheet:面试中数学技巧、边界陷阱与快算算子实现

2026-09-04 16:12:35作者:贡沫苏Truman

本篇基于 math.md 整理,覆盖 Tech Interview Handbook 算法专题中"数学(Math)"这一附加主题的核心内容:面试时需警惕的三类陷阱、必背的常用公式表、取模/浮点比较/快速算子三大技巧,以及配套的必刷题目清单。读完本篇,你将知道如何在编码面试中正确处理除零、溢出、负数与浮点边界,并能用"倍增(快速幂)""减半(二分)"两类思路把幂、平方根、除法等算子做到 O(log n) 级别。

数学题在编码面试中的定位

数学是计算机科学的基础,任何程序员都需要具备基本的数学素养。原文档在 Introduction 一节明确指出:就编码面试而言,通常不会涉及大量数学,但掌握一些基础数学技巧很有帮助,因为面试官可能会要求你手动实现某些数学运算

从仓库结构看,该文档是"Algorithms study cheatsheets"专题下的一篇学习指南。在 sidebars.js 中,algorithms/mathdynamic-programmingbinarygeometry 一起被归入 Additional 类别——即相对数组、字符串等高频主题之外、值得额外准备的加分项。按 study-cheatsheet.md 的说明,每篇专题指南都遵循统一骨架:概述、面试注意事项、Corner cases、实用技巧、必备题目与推荐练习题,本文的章节结构也据此展开。

面试中需要警惕的三类陷阱

原文档"Things to look out for during interviews"一节给出了三条核心原则,这里完整继承并补充说明:

  1. 涉及除法或取模时,检查除以 0 的情况。 这是最常见的崩溃点。例如手写除法语义的函数(见后文 Sqrt(x)、Pow(x, n) 一类题目)时,除数在迭代过程中可能归零或参数本身可能为 0。

  2. 使用 Java、C++ 等强类型语言时,检查溢出/下溢(overflow/underflow)。 原文档给出的务实建议是:至少主动提及"溢出/下溢是可能的",并询问面试官是否需要处理。在面试中主动点出这类问题本身就是加分项。一个直观的例子是二分法中计算中点的写法——仓库内 binarySearch.js 使用的是:

    const mid = left + Math.floor((right - left) / 2);
    

    而非 Math.floor((left + right) / 2)。在 C++ 等语言中,后者在 left + right 超过 INT_MAX 时就会溢出,前者的"先做差再减半"写法正是规避溢出的标准手法。

  3. 考虑负数与浮点数。 听起来显然,但原文档提醒:在面试压力下,很多显而易见的情形会被忽略。仓库中的示例代码恰好印证了这一点——intToBin.jsbinToInt.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.jsbinary_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 组件统一引入算法课程推荐,该共享文件被算法专题各篇(包括本篇)复用,推荐了三门课程:

  1. AlgoMonster——由 Google 工程师打造,采用数据驱动方式教授高频题型模式,强调最短时间通过技术面试,一次性付费、终身访问;
  2. Grokking the Coding Interview: Patterns for Coding Questions(Design Gurus)——从"题型模式(pattern)"视角组织练习,支持 Java、Python、C++、JavaScript,并提供分步可视化,理念是"学习理解模式,而非背答案";
  3. Master the Coding Interview: Data Structures + Algorithms(Udemy)——约 19 小时内容,除编码外还覆盖简历、非技术面试与薪酬谈判,编码演示使用 JavaScript。

延伸阅读

登录后查看全文
热门项目推荐
相关项目推荐