ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

如何快速掌握排序与搜索?cracking-the-coding-interview 第10章10道高频面试题完整解析

如何快速掌握排序与搜索?cracking-the-coding-interview 第10章10道高频面试题完整解析 如何快速掌握排序与搜索cracking-the-coding-interview 第10章10道高频面试题完整解析【免费下载链接】cracking-the-coding-interview:books: C and Python solutions with automated tests for Cracking the Coding Interview 6th Edition.项目地址: https://gitcode.com/gh_mirrors/cra/cracking-the-coding-interview学习cracking-the-coding-interview破解编程面试时第10章「排序与搜索」是算法面试的重灾区。本项目为《Cracking the Coding Interview》第6版提供了C 与 Python 双语言解法并配有完整的自动化测试。本章不仅手写实现了经典的 mergeSort、quickSort 和 binarySearch还覆盖了稀疏数组搜索、旋转数组查找、百万级数据去重等 10 道高频面试题。本文带你逐一拆解核心思路快速建立排序与搜索的面试知识体系。一、章节全景这一章学什么第10章的所有解法集中在cpp_solutions/chapter_10_sorting_and_searching/目录下Python 版本则在python_solutions/chapter_10_sorting_and_searching/含merge_sort.py、quick_sort.py等。本章内容可以分成三大块模块核心内容对应文件排序基础手写归并排序、快速排序mergeSort.h、quickSort.h搜索基础递归二分查找binarySearch.h高频变体题稀疏数组、旋转数组、矩阵搜索等 10 题problem_10_01~problem_10_11所有题目通过tests.cpp中的 Catch 测试用例驱动验证运行make test即可一键跑完全部测试。二、手写 mergeSort 与 quickSort排序两大基石 面试中最常见的要求就是「不用库函数手写一个排序」。归并排序mergeSort典型的分治思想——先把数组从中间切成两半分别排序再用mergeHelper把两个有序子数组合并。合并时用辅助数组从头比较、取较小值最后拷回原数组。时间复杂度 O(N log N)最坏情况也稳定空间复杂度 O(N)需要辅助数组关键代码在 mergeSort.hsortHelper负责递归切分mergeHelper负责合并入口函数mergeSort只需一行。快速排序quickSort选最后一个元素作为基准值partitionValue扫描整个数组把小于等于基准的交换到前半部分得到 partitionIndex再对左右两半递归排序。平均时间 O(N log N)常数因子小、实践中通常最快最坏 O(N²)已排序数组 固定取末尾作基准时实现见 quickSort.hpartition函数仅十余行是面试复述的重点。 面试小技巧先说「归并稳定、快排不稳定」再说「空间换时间」与「原地分区」的取舍比默写代码更能拿分。三、二分查找一切搜索变体的母版 binarySearch.h 中的递归二分查找是所有变体题的地基。三个终止条件要记牢start end区间为空返回 -1中点命中目标返回下标start end单元素不匹配返回 -1其余情况比较目标值与中点值决定递归左半还是右半。中点计算用(end - start) / 2 start可避免整数溢出这个细节在面试中非常加分。四、10 道高频面试题逐个拆解1️⃣ 有序合并problem 10.01两个有序数组 A、BA 尾部预留了足够空间把 B 合并进 A。核心思路三个指针从后往前归并——每次比较 A、B 的末尾元素把较大的写到 A 的最右端。从后往前就完全不会覆盖 A 的未处理元素实现 O(N) 时间、O(1) 空间。文件problem_10_01_sortedMerge.h2️⃣ 变位词分组排序problem 10.02让所有互为变位词anagram的字符串排在一起。核心思路把每个字符串排序后作为哈希表的 key变位词排序后必然相同value 存原始字符串。最后把表内字符串按组输出即可总体 O(N)。文件problem_10_02_anagramSort.cpp3️⃣ 旋转数组搜索problem 10.03有序数组被未知偏移量旋转后如何查找元素核心思路切半后至少一半是有序的。先判断目标值是否落在有序那一半的范围内是就直接二分否则递归进入另一半。平均 O(log N)。文件problem_10_03_rotatedSearch.h4️⃣ 未知长度的数组搜索problem 10.04给定一个没有size()方法的 Listy 结构elementAt(i)越界返回 -1在 O(log N) 内找到目标元素。核心思路先用指数探测找上界——依次探测下标 2⁰、2¹、2²……直到返回 -1确定目标所在区间再对该区间做二分并把 -1 视为「大于任何查询值」。文件problem_10_04_searchNoSize.cpp5️⃣ 稀疏数组搜索problem 10.05⭐经典高频题字符串数组已排序但中间混有大量空串如何搜索核心思路直接二分会卡在空串上。改进版二分当取到的中点是空串时向左右线性扩展寻找最近的非空串作为替代中点再正常二分收缩区间。最好 O(log N)最坏 O(N)。文件problem_10_05_sparseSearch.cpp6️⃣ 十亿级数据找缺失整数problem 10.07一个文件里有 40 亿个非负整数只有 1GB 内存给出一个不在文件中的整数。核心思路位数组bit vector32 位整数最多 2³² 种取值2³² 个 bit ≈ 500MB恰好装得下。用整数本身做下标翻 bit最后扫出第一个 0 位即可时间 O(N)。文件problem_10_07_missingInt.cpp7️⃣ 4KB 内存打印重复元素problem 10.08数组含 1~NN≤32000的数可能有重复只有 4KB 内存如何打印所有重复元素核心思路4KB 32000 bit正好每个数分配一位。但 1 个 bit 无法区分「出现过」和「重复过」所以用2 个 bit出现位 重复位扫两遍文件即可只输出一次的纯重复元素——这个细节比原版书解法更严谨。文件problem_10_08_findDuplicates.cpp8️⃣ 行列都有序的矩阵搜索problem 10.09M×N 矩阵每行每列都升序查找某元素。核心思路朴素法从右上角出发比目标大就左移、比目标小就下移O(MN)。进阶解法是对矩阵对角线做二分缩小范围。注意直接把行拼接成一维数组做二分是错误的因为拼接后并不有序。文件problem_10_09_matrixSearch.h9️⃣ 流中实时查询排名problem 10.10数据以流式到达track(x)不断加入新数getRank(x)要返回不大于 x 的数的个数。核心思路用二叉搜索树每个节点额外保存「左子树节点数」。track 是 O(log N) 插入getRank 沿路径累加左子树规模即可得到排名。文件problem_10_10_rankFromStream.h 峰谷交错排序problem 10.11把数组排成「峰、谷、峰、谷……」交替的形式。核心思路完全不用完整排序每次看相邻的三个数若中间数不满足峰谷交替条件就交换后两者然后前进两步。一趟扫描 O(N) 完成。文件problem_10_11_peaksAndValleys.h五、动手验证一键运行全部测试 本项目最大的优势是每道题都配自动化测试。克隆仓库后make configure # 初始化依赖 make test # 先跑 C 测试tests.cpp再跑 Python 测试tests.py其中tests.cpp对 mergeSort、quickSort、binarySearch 及各题目均有独立 TEST_CASE 覆盖tests.py负责 Python 解法。想深入阅读测试细节可以查看根目录的 tests.cpp。六、学习路线建议第一遍吃透二分查找的三种终止条件它是本章一切变体的母版第二遍能手写 mergeSort 和 quickSort并说清各自稳定性与复杂度差异第三遍重点攻克稀疏数组搜索、旋转数组搜索这两道「二分的边界情况题」加分项位数组处理十亿级数据10.07 / 10.08展示你对空间复杂度的敏感度排序与搜索看似基础但面试变体极多。配合本项目的 C/Python 双实现和自动化测试反复练习第10章的 10 道高频题足以覆盖绝大多数排序与搜索类面试题。祝面试顺利【免费下载链接】cracking-the-coding-interview:books: C and Python solutions with automated tests for Cracking the Coding Interview 6th Edition.项目地址: https://gitcode.com/gh_mirrors/cra/cracking-the-coding-interview创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表