《程序员面试金典》
本书是原谷歌资深面试官的经验之作,帮助了许多想要加入脸书、苹果、谷歌等 IT 名企的求职者拿到 Dream offer。本专题的 100+ 编程面试题是在原书基础上精心挑选出来的,帮助你轻松应战 IT 名企技术面试。
Michael阿明
两个孩子的父亲,8年机械工程师,已转行互联网做算法,一起继续加油!高举智慧,她就使你高升;怀抱智慧,她就使你尊荣。-- 箴言(4:8)
展开
-
《程序员面试金典》解题目录(更新完毕)
题目来源于LeetCode上的《程序员面试金典》,这里做一个目录方便大家查找。另外有本人的LeetCode解题目录、《剑指Offer》解题目录可点击链接查看。原创 2020-02-14 09:33:16 · 5539 阅读 · 29 评论 -
程序员面试金典 - 面试题 17.26. 稀疏相似度(哈希map)
1. 题目两个(具有不同单词的)文档的交集(intersection)中元素的个数除以并集(union)中元素的个数,就是这两个文档的相似度。例如,{1, 5, 3} 和 {1, 7, 2, 3} 的相似度是 0.4,其中,交集的元素有 2 个,并集的元素有 5 个。给定一系列的长篇文档,每个文档元素各不相同,并与一个 ID 相关联。它们的相似度非常“稀疏”,也就是说任选 2 个文档,相似度...原创 2020-04-17 08:18:35 · 1660 阅读 · 16 评论 -
程序员面试金典 - 面试题 16.18. 模式匹配(逻辑题)
1. 题目你有两个字符串,即pattern和value。pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式。例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a",“go"是"b”),该字符串也匹配像"a"、"ab"和"b"这样的模式。但需注意"a"和"b"不能同时表示相同的字符串。编写一个方法判断value字符串是否匹配pattern...原创 2020-04-17 01:18:28 · 1679 阅读 · 10 评论 -
程序员面试金典 - 面试题 17.25. 单词矩阵(Trie树+DFS回溯,hard)
1. 题目给定一份单词的清单,设计一个算法,创建由字母组成的面积最大的矩形,其中每一行组成一个单词(自左向右),每一列也组成一个单词(自上而下)。不要求这些单词在清单里连续出现,但要求所有行等长,所有列等高。如果有多个面积最大的矩形,输出任意一个均可。一个单词可以重复使用。示例 1:输入: ["this", "real", "hard", "trh", "hea", "iar", "sl...原创 2020-04-16 23:26:33 · 847 阅读 · 8 评论 -
程序员面试金典 - 面试题 08.02. 迷路的机器人(DFS/动态规划)
文章目录1. 题目2. 解题2.1 DFS2.2 动态规划1. 题目设想有个机器人坐在一个网格的左上角,网格 r 行 c 列。机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径。网格中的障碍物和空位置分别用 1 和 0 来表示。返回一条可行的路径,路径由经过的网格的行号和列号组成。左上角为 0 行 0 列。示例 1:...原创 2020-04-16 18:05:51 · 1467 阅读 · 16 评论 -
程序员面试金典 - 面试题 17.06. 2出现的次数(找递推规律)
1. 题目编写一个方法,计算从 0 到 n (含 n) 中数字 2 出现的次数。示例:输入: 25输出: 9解释: (2, 12, 20, 21, 22, 23, 24, 25)(注意 22 应该算作两次)提示:n <= 10^9来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/number-of-2s-in-ran...原创 2020-04-16 15:59:11 · 1278 阅读 · 14 评论 -
程序员面试金典 - 面试题 08.14. 布尔运算(区间动态规划)
1. 题目给定一个布尔表达式和一个期望的布尔结果 result,布尔表达式由 0 (false)、1 (true)、& (AND)、 | (OR) 和 ^ (XOR) 符号组成。实现一个函数,算出有几种可使该表达式得出 result 值的括号方法。示例 1:输入: s = "1^0|0|1", result = 0输出: 2解释: 两种可能的括号方法是1^(0|(0|1))...原创 2020-04-16 13:59:07 · 1605 阅读 · 22 评论 -
程序员面试金典 - 面试题 17.23. 最大黑方阵(DP)
1. 题目给定一个方阵,其中每个单元(像素)非黑即白。设计一个算法,找出 4 条边皆为黑色像素的最大子方阵。返回一个数组 [r, c, size] ,其中 r, c 分别代表子方阵左上角的行号和列号,size 是子方阵的边长。若有多个满足条件的子方阵,返回 r 最小的,若 r 相同,返回 c 最小的子方阵。若无满足条件的子方阵,返回空数组。matrix.length == matri...原创 2020-04-15 18:30:08 · 1524 阅读 · 14 评论 -
程序员面试金典 - 面试题 08.13. 堆箱子(DP)
1. 题目堆箱子。给你一堆n个箱子,箱子宽 wi、深 di、高 hi。箱子不能翻转,将箱子堆起来时,下面箱子的宽度、高度和深度必须大于上面的箱子。实现一种方法,搭出最高的一堆箱子。箱堆的高度为每个箱子高度的总和。输入使用数组[wi, di, hi]表示每个箱子。示例1: 输入:box = [[1, 1, 1], [2, 2, 2], [3, 3, 3]] 输出:6 示例2: ...原创 2020-04-15 16:44:21 · 1651 阅读 · 10 评论 -
程序员面试金典 - 面试题 17.24. 最大子矩阵(转成一维最大子序和 DP)
文章目录1. 题目2. 解题2.1 前缀和(超时)2.2 动态规划1. 题目给定一个正整数和负整数组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。示例:输入:[ [-1,0], ...原创 2020-04-15 15:03:10 · 1194 阅读 · 6 评论 -
程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)
1. 题目一只蚂蚁坐在由白色和黑色方格构成的无限网格上。开始时,网格全白,蚂蚁面向右侧。每行走一步,蚂蚁执行以下操作。(1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并向前移动一个单位。(2) 如果在黑色方格上,则翻转方格的颜色,向左(逆时针方向)转 90 度,并向前移动一个单位。编写程序来模拟蚂蚁执行的前 K 个动作,并返回最终的网格。网格由数组表示,每...原创 2020-04-14 20:34:56 · 1387 阅读 · 16 评论 -
程序员面试金典 - 面试题 16.14. 最佳直线(哈希map+set)
1. 题目给定一个二维平面及平面上的 N 个点列表Points,其中第i个点的坐标为Points[i]=[Xi,Yi]。请找出一条直线,其通过的点的数目最多。设穿过最多点的直线所穿过的全部点编号从小到大排序的列表为S,你仅需返回[S[0],S[1]]作为答案若有多条直线穿过了相同数量的点,则选择S[0]值较小的直线返回,S[0]相同则选择S[1]值较小的直线返回。示例:输入: [[0,...原创 2020-04-14 18:01:24 · 724 阅读 · 27 评论 -
程序员面试金典 - 面试题 05.08. 绘制直线(位运算)
1. 题目绘制直线。有个单色屏幕存储在一个一维数组中,使得32个连续像素可以存放在一个 int 里。屏幕宽度为w,且w可被32整除(即一个 int 不会分布在两行上),屏幕高度可由数组长度及屏幕宽度推算得出。请实现一个函数,绘制从点(x1, y)到点(x2, y)的水平线。给出数组的长度 length,宽度 w(以比特为单位)、直线开始位置 x1(比特为单位)、直线结束位置 x2(比特为单...原创 2020-04-14 15:29:24 · 665 阅读 · 10 评论 -
程序员面试金典 - 面试题 17.13. 恢复空格(DP+Trie树)
文章目录1. 题目2. 解题2.1 动态规划1. 题目哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!"已经变成了"iresetthecomputeritstilldidntboot"。在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dict...原创 2020-04-14 12:02:03 · 897 阅读 · 8 评论 -
程序员面试金典 - 面试题 16.13. 平分正方形(数学)
1. 题目给定两个正方形及一个二维平面。请找出将这两个正方形分割成两半的一条直线。假设正方形顶边和底边与 x 轴平行。每个正方形的数据square包含3个数值,正方形的左下顶点坐标[X,Y] = [square[0],square[1]],以及正方形的边长square[2]。所求直线穿过两个正方形会形成4个交点,请返回4个交点形成线段的两端点坐标(两个端点即为4个交点中距离最远的2个点,这...原创 2020-04-13 12:24:52 · 1126 阅读 · 16 评论 -
程序员面试金典 - 面试题 16.03. 交点(数学)
1. 题目给定两条线段(表示为起点start = {X1, Y1}和终点end = {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值。要求浮点型误差不超过10^-6。若有多个交点(线段重叠)则返回 X 值最小的点,X 坐标相同则返回 Y 值最小的点。示例 1:输入:line1 = {0, 0}, {1, 0}line2 = {1, 1}, {0, -1}输出: {...原创 2020-04-12 15:16:01 · 962 阅读 · 23 评论 -
程序员面试金典 - 面试题 17.17. 多次搜索(Trie树)
文章目录1. 题目2. 解题2.1 暴力超时2.2 Trie树1. 题目给定一个较长字符串big和一个包含较短字符串的数组smalls,设计一个方法,根据smalls中的每一个较短字符串,对big进行搜索。输出smalls中的字符串在big里出现的所有位置positions,其中 positions[i] 为 smalls[i] 出现的所有位置。示例:输入:big = "mississ...原创 2020-04-11 20:17:27 · 745 阅读 · 12 评论 -
程序员面试金典 - 面试题 17.22. 单词转换(BFS)
1. 题目给定字典中的两个词,长度相等。写一个方法,把一个词转换成另一个词, 但是一次只能改变一个字符。每一步得到的新词都必须能在字典中找到。编写一个程序,返回一个可能的转换序列。如有多个可能的转换序列,你可以返回任何一个。示例 1:输入:beginWord = "hit",endWord = "cog",wordList = ["hot","dot","dog","lot","...原创 2020-04-11 17:00:53 · 1252 阅读 · 24 评论 -
程序员面试金典 - 面试题 16.09. 运算(只用+法做乘除)
1. 题目请实现整数数字的乘法、减法和除法运算,运算结果均为整数数字,程序中只允许使用加法运算符和逻辑运算符,允许程序中出现正负常数,不允许使用位运算。你的实现应该支持如下操作:Operations() 构造函数minus(a, b) 减法,返回a - bmultiply(a, b) 乘法,返回a * bdivide(a, b) 除法,返回a / b示例:Operations...原创 2020-04-11 13:43:35 · 889 阅读 · 22 评论 -
程序员面试金典 - 面试题 17.15. 最长单词(排序+递归)
1. 题目给定一组单词words,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。若有多个长度相同的结果,返回其中字典序最小的一项,若没有符合要求的单词则返回空字符串。示例:输入: ["cat","banana","dog","nana","walk","walker","dogwalker"]输出: "dogwalker"解释: "dogwalker"可由"...原创 2020-04-10 20:25:55 · 882 阅读 · 14 评论 -
程序员面试金典 - 面试题 17.18. 最短超串(双指针+哈希)
1. 题目假设你有两个数组,一个长一个短,短的元素均不相同。找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要。返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点最小的一个。若不存在,返回空数组。示例 1:输入:big = [7,5,9,0,2,1,3,5,7,9,1,1,5,8,8,9,7]small = [1,5,9]输出: [7,10]示...原创 2020-04-10 17:51:59 · 1173 阅读 · 20 评论 -
程序员面试金典 - 面试题 04.09. 二叉搜索树序列(双端队列+回溯)**
1. 题目从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。给定一个由不同节点组成的二叉树,输出所有可能生成此树的数组。示例:给定如下二叉树 2 / \ 1 3返回:[ [2,1,3], [2,3,1]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/...原创 2020-04-09 23:29:28 · 836 阅读 · 14 评论 -
程序员面试金典 - 面试题 05.04. 下一个数(线性扫描)
文章目录1. 题目2. 解题2.1 STL2.2 线性扫描1. 题目下一个数。给定一个正整数,找出与其二进制表达式中1的个数相同且大小最接近的那两个数(一个略大,一个略小)。例1: 输入:num = 2(或者0b10) 输出:[4, 1] 或者([0b100, 0b1]) 例2: 输入:num = 1 输出:[2, -1] 提示:num的范围在[1, 2147483647]...原创 2020-04-08 15:09:54 · 1451 阅读 · 20 评论 -
程序员面试金典 - 面试题 17.08. 马戏团人塔(最长上升子序 DP/二分查找)
文章目录1. 题目2. 解题2.1 超时解2.2 二分查找1. 题目有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上。出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一点。已知马戏团每个人的身高和体重,请编写代码计算叠罗汉最多能叠几个人。示例:输入:height = [65,70,56,75,60,68] weight = [100,150,90,190,95,110...原创 2020-04-07 17:24:11 · 2637 阅读 · 26 评论 -
程序员面试金典 - 面试题 17.05. 字母与数字(哈希map+思维转换)
1. 题目给定一个放有字符和数字的数组,找到最长的子数组,且包含的字符和数字的个数相同。返回该子数组,若存在多个最长子数组,返回左端点最小的。若不存在这样的数组,返回一个空数组。示例 1:输入: ["A","1","B","C","D","2","3","4","E","5","F","G","6","7","H","I","J","K","L","M"]输出: ["A","1","B"...原创 2020-04-05 21:12:05 · 1877 阅读 · 22 评论 -
程序员面试金典 - 面试题 16.26. 计算器(栈)
1. 题目给定一个包含 正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。示例 1:输入: “3+2*2”输出: 7示例 2:输入: " 3/2 "输出: 1示例 3:输入: " 3+5 / 2 "输出: 5说明:你可以假设所给定的表达式都是有效的。...原创 2020-04-04 18:51:08 · 1605 阅读 · 6 评论 -
程序员面试金典 - 面试题 10.03. 搜索旋转数组(二分查找)
1. 题目搜索旋转数组。给定一个排序后的数组,包含n个整数,但这个数组已被旋转过很多次了,次数不详。请编写代码找出数组中的某个元素,假设数组元素原先是按升序排列的。若有多个相同元素,返回索引值最小的一个。示例1: 输入: arr = [15, 16, 19, 20, 25, 1, 3, 4, 5, 7, 10, 14], target = 5 输出: 8(元素5在该数组中的索引) 示...原创 2020-04-04 17:13:31 · 1612 阅读 · 6 评论 -
程序员面试金典 - 面试题 16.16. 部分排序(排序/不排序)
文章目录1. 题目2. 解题2.1 排序2.2 不排序1. 题目给定一个整数数组,编写一个函数,找出索引 m 和 n ,只要将索引区间 [m,n] 的元素排好序,整个数组就是有序的。注意:n-m 尽量最小,也就是说,找出符合条件的最短序列。函数返回值为[m,n],若不存在这样的m和n(例如整个数组是有序的),请返回[-1,-1]。示例:输入: [1,2,4,7,10,11,7,12,6...原创 2020-04-03 23:52:56 · 932 阅读 · 22 评论 -
程序员面试金典 - 面试题 16.21. 交换和(哈希set)
1. 题目给定两个整数数组,请交换一对数值(每个数组中取一个数值),使得两个数组所有元素的和相等。返回一个数组,第一个元素是第一个数组中要交换的元素,第二个元素是第二个数组中要交换的元素。若有多个答案,返回任意一个均可。若无满足条件的数值,返回空数组。示例:输入: array1 = [4, 1, 2, 1, 1, 2], array2 = [3, 6, 3, 3]输出: [1, 3]...原创 2020-04-03 22:50:47 · 1023 阅读 · 18 评论 -
程序员面试金典 - 面试题 16.24. 数对和(双指针/哈希map)
文章目录1. 题目2. 解题2.1 排序+双指针2.2 哈希map1. 题目设计一个算法,找出数组中两数之和为指定值的所有整数对。一个数只能属于一个数对。示例 1:输入: nums = [5,6,5], target = 11输出: [[5,6]]示例 2:输入: nums = [5,6,5,6], target = 11输出: [[5,6],[5,6]]提示:nums.l...原创 2020-04-03 22:31:51 · 1246 阅读 · 12 评论 -
程序员面试金典 - 面试题 17.07. 婴儿名字(并查集)
1. 题目每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量。有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来。给定两个列表,一个是名字及对应的频率,另一个是本质相同的名字对。设计一个算法打印出每个真实名字的实际频率。注意,如果 John 和 Jon 是相同的,并且 Jon 和 Johnny 相同,则 John 与...原创 2020-04-03 20:41:43 · 1895 阅读 · 12 评论 -
程序员面试金典 - 面试题 17.09. 第 k 个数(set优先队列/DP)
1. 题目有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。示例 1:输入: k = 5输出: 9来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/get-kth-magic-number-lcci...原创 2020-04-02 12:11:13 · 3769 阅读 · 19 评论 -
程序员面试金典 - 面试题 10.10. 数字流的秩(map/树状数组)
文章目录1. 题目2. 解题2.1 map2.2 树状数组1. 题目假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。请实现数据结构和算法来支持这些操作,也就是说:实现 track(int x) 方法,每读入一个数字都会调用该方法;实现 getRankOfNumber(int x) 方法,返回 小于或等于 x 的值的个数。示例:...原创 2020-04-01 21:57:00 · 2440 阅读 · 20 评论 -
程序员面试金典 - 面试题 10.11. 峰与谷(排序/不排序)
1. 题目在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整数的元素。例如,在数组{5, 8, 2, 6, 3, 4, 3}中,{8, 6}是峰, {3, 2}是谷。现在给定一个整数数组,将该数组按峰与谷的交替顺序排序。示例:输入: [5, 3, 1, 2, 3]输出: [5, 1, 3, 2, 3]提示:nums.length <= 10...原创 2020-04-01 15:25:33 · 1724 阅读 · 10 评论 -
程序员面试金典 - 面试题 10.02. 变位词组(哈希map)
1. 题目编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"],输出:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]说明:所有输入均为小写字母。不考虑答案输出的顺序。来源...原创 2020-03-31 20:39:08 · 1490 阅读 · 12 评论 -
程序员面试金典 - 面试题 08.05. 递归乘法(位运算)
1. 题目递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。示例1: 输入:A = 1, B = 10 输出:10 示例2: 输入:A = 3, B = 4 输出:12 提示:保证乘法范围不会溢出来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/recur...原创 2020-03-31 19:06:12 · 3024 阅读 · 18 评论 -
程序员面试金典 - 面试题 16.20. T9键盘(数组)
1. 题目在老式手机上,用户通过数字键盘输入,手机将提供与这些数字相匹配的单词列表。每个数字映射到0至4个字母。给定一个数字序列,实现一个算法来返回匹配单词的列表。你会得到一张含有有效单词的列表。映射如下图所示:示例 1:输入: num = "8733", words = ["tree", "used"]输出: ["tree", "used"]示例 2:输入: num = "2...原创 2020-03-30 11:02:17 · 2193 阅读 · 35 评论 -
程序员面试金典 - 面试题 16.19. 水域大小(BFS/DFS)
1. 题目你有一个用于表示一片土地的整数矩阵 land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到大排序。示例:输入:[ [0,2,1,0], [0,1,0,1], [1,1,0,1], [0,1,0,1]]输出: [1...原创 2020-03-29 18:51:27 · 3512 阅读 · 18 评论 -
程序员面试金典 - 面试题 16.10. 生存人数(自定义优先队列)
文章目录1. 题目2. 解题2.1 优先队列1. 题目给定N个人的出生年份和死亡年份,第i个人的出生年份为 birth[i],死亡年份为 death[i],实现一个方法以计算生存人数最多的年份。你可以假设所有人都出生于1900年至2000年(含1900和2000)之间。如果一个人在某一年的任意时期都处于生存状态,那么他们应该被纳入那一年的统计中。例如,生于1908年、死于1909年的人应...原创 2020-03-29 09:05:13 · 6125 阅读 · 10 评论 -
程序员面试金典 - 面试题 16.02. 单词频率(哈希表/Trie树)
文章目录1. 题目2. 解题2.1 哈希解法2.2 Trie树1. 题目设计一个方法,找出任意指定单词在一本书中的出现频率。你的实现应该支持如下操作:WordsFrequency(book)构造函数,参数为字符串数组构成的一本书get(word)查询指定单词在数中出现的频率示例:WordsFrequency wordsFrequency = new WordsFrequency(...原创 2020-03-28 18:05:41 · 1211 阅读 · 8 评论