程序员面试金典
漆黑丶
帅哥
展开
-
【面试题】 17.07. 婴儿名字
题目:每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量。有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来。给定两个列表,一个是名字及对应的频率,另一个是本质相同的名字对。设计一个算法打印出每个真实名字的实际频率。注意,如果 John 和 Jon 是相同的,并且 Jon 和 Johnny 相同,则 John 与 Johnny 也相同,即它们有传递和对称性。在结果列表中,选择 字典序最小 的名字作为真实名字。示例:输入:name原创 2021-11-12 15:55:37 · 104 阅读 · 0 评论 -
【面试题】 08.06. 汉诺塔问题
题目:在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:(1) 每次只能移动一个盘子;(2) 盘子只能从柱子顶端滑出移到下一根柱子;(3) 盘子只能叠在比它大的盘子上。请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。你需要原地修改栈。示例1:输入:A = [2, 1, 0], B = [], C = []输出:C = [2, 1,原创 2021-10-20 10:11:00 · 134 阅读 · 0 评论 -
【面试题】 17.05. 字母与数字
题目:给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组。示例 1:输入: [“A”,“1”,“B”,“C”,“D”,“2”,“3”,“4”,“E”,“5”,“F”,“G”,“6”,“7”,“H”,“I”,“J”,“K”,“L”,“M”]输出: [“A”,“1”,“B”,“C”,“D”,“2”,“3”,“4”,“E”,“5”,“F”,“G”,“6”,“7”]示例 2:原创 2021-10-15 09:59:44 · 149 阅读 · 0 评论 -
【面试题】 17.11. 单词距离
题目:有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?示例:输入:words = [“I”,“am”,“a”,“student”,“from”,“a”,“university”,“in”,“a”,“city”], word1 = “a”, word2 = “student”输出:1提示:words.length <= 100000答案:class Solution原创 2021-10-13 20:51:30 · 109 阅读 · 0 评论 -
【面试题】 16.26. 计算器
题目:给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。示例 1:输入: “3+2*2”输出: 7示例 2:输入: " 3/2 "输出: 1示例 3:输入: " 3+5 / 2 "输出: 5说明:你可以假设所给定的表达式都是有效的。请不要使用内置的库函数 eval。答案:class Solution { public int calc原创 2021-10-12 17:37:50 · 133 阅读 · 0 评论 -
【面试题】 17.14. 最小K个数
题目:设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。示例:输入: arr = [1,3,5,7,2,4,6,8], k = 4输出: [1,2,3,4]提示:0 <= len(arr) <= 1000000 <= k <= min(100000, len(arr))答案:class Solution { public int[] smallestK(int[] arr, int k) { //排序后选择 i原创 2021-10-12 16:56:18 · 46 阅读 · 0 评论 -
【面试题】 17.09. 第 k 个数
题目:有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。示例 1:输入: k = 5输出: 9答案:class Solution { public int getKthMagicNumber(int k) { //p1,p2,p3分别表示3,5,7的每次最小的下标。每次选择分别乘3、5、7的最小值给数组,然后下标+1. int[原创 2021-10-12 16:51:02 · 65 阅读 · 0 评论 -
【面试题】 16.21. 交换和
题目:给定两个整数数组,请交换一对数值(每个数组中取一个数值),使得两个数组所有元素的和相等。返回一个数组,第一个元素是第一个数组中要交换的元素,第二个元素是第二个数组中要交换的元素。若有多个答案,返回任意一个均可。若无满足条件的数值,返回空数组。示例:输入: array1 = [4, 1, 2, 1, 1, 2], array2 = [3, 6, 3, 3]输出: [1, 3]示例:输入: array1 = [1, 2, 3], array2 = [4, 5, 6]输出: []提示:1原创 2021-09-28 17:31:42 · 138 阅读 · 0 评论 -
【面试题】 16.16. 部分排序
题目:给定一个整数数组,编写一个函数,找出索引m和n,只要将索引区间[m,n]的元素排好序,整个数组就是有序的。注意:n-m尽量最小,也就是说,找出符合条件的最短序列。函数返回值为[m,n],若不存在这样的m和n(例如整个数组是有序的),请返回[-1,-1]。示例:输入: [1,2,4,7,10,11,7,12,6,7,16,18,19]输出: [3,9]提示:0 <= len(array) <= 1000000答案:class Solution { public int原创 2021-09-16 11:24:01 · 108 阅读 · 0 评论 -
【面试题】 16.10. 生存人数
题目:给定 N 个人的出生年份和死亡年份,第 i 个人的出生年份为 birth[i],死亡年份为 death[i],实现一个方法以计算生存人数最多的年份。你可以假设所有人都出生于 1900 年至 2000 年(含 1900 和 2000 )之间。如果一个人在某一年的任意时期处于生存状态,那么他应该被纳入那一年的统计中。例如,生于 1908 年、死于 1909 年的人应当被列入 1908 年和 1909 年的计数。如果有多个年份生存人数相同且均为最大值,输出其中最小的年份。示例:输入:birth原创 2021-09-14 16:40:41 · 126 阅读 · 0 评论 -
【面试题】 16.09. 运算
题目:请实现整数数字的乘法、减法和除法运算,运算结果均为整数数字,程序中只允许使用加法运算符和逻辑运算符,允许程序中出现正负常数,不允许使用位运算。你的实现应该支持如下操作:Operations() 构造函数minus(a, b) 减法,返回a - bmultiply(a, b) 乘法,返回a * bdivide(a, b) 除法,返回a / b示例:Operations operations = new Operations();operations.minus(1, 2); //返回-原创 2021-09-14 16:23:45 · 140 阅读 · 0 评论 -
【面试题】 16.06. 最小差
题目:给定两个整数数组a和b,计算具有最小差绝对值的一对数值(每个数组中取一个值),并返回该对数值的差示例:输入:{1, 3, 15, 11, 2}, {23, 127, 235, 19, 8}输出:3,即数值对(11, 8)提示:1 <= a.length, b.length <= 100000-2147483648 <= a[i], b[i] <= 2147483647正确结果在区间 [0, 2147483647] 内答案:class Solution {原创 2021-09-14 16:10:01 · 125 阅读 · 0 评论 -
【面试题】 10.11. 峰与谷
题目:在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整数的元素。例如,在数组{5, 8, 4, 2, 3, 4, 6}中,{8, 6}是峰, {5, 2}是谷。现在给定一个整数数组,将该数组按峰与谷的交替顺序排序。示例:输入: [5, 3, 1, 2, 3]输出: [5, 1, 3, 2, 3]提示:nums.length <= 10000答案:class Solution { public void wiggleSort(int[] num原创 2021-09-14 15:54:11 · 139 阅读 · 0 评论 -
【面试题】 10.10. 数字流的秩
题目:假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。请实现数据结构和算法来支持这些操作,也就是说:实现 track(int x) 方法,每读入一个数字都会调用该方法;实现 getRankOfNumber(int x) 方法,返回小于或等于 x 的值的个数。注意:本题相对原题稍作改动示例:输入:["StreamRank", "getRankOfNumber", "track", "getRankOfNumber"][[], [1], [0],原创 2021-09-14 15:40:31 · 132 阅读 · 0 评论 -
【面试题】 10.09. 排序矩阵查找
题目:给定M×N矩阵,每一行、每一列都按升序排列,请编写代码找出某元素。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target = 5,返回 true。给定 target = 20,返回 false。答案:class Solution { p原创 2021-09-14 15:29:31 · 183 阅读 · 0 评论 -
【面试题】 10.02. 变位词组
题目:编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。注意:本题相对原题稍作修改示例:输入:["eat", "tea", "tan", "ate", "nat", "bat"],输出:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]说明:所有输入均为小写字母。不考虑答案输出的顺序。答案:class Solution { public List<List<原创 2021-09-10 14:34:30 · 137 阅读 · 0 评论 -
【面试题】 16.04. 井字游戏
题目:设计一个算法,判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘,由字符" ",“X"和"O"组成,其中字符” "代表一个空位。以下是井字游戏的规则:玩家轮流将字符放入空位(" “)中。第一个玩家总是放字符"O”,且第二个玩家总是放字符"X"。"X"和"O"只允许放置在空位中,不允许对已放有字符的位置进行填充。当有N个相同(且非空)的字符填充任何行、列或对角线时,游戏结束,对应该字符的玩家获胜。当所有位置非空时,也算为游戏结束。如果游戏结束,玩家不允许再放置字符。如果游戏存原创 2021-09-09 17:35:22 · 155 阅读 · 0 评论 -
【面试题】 16.02. 单词频率
题目:设计一个方法,找出任意指定单词在一本书中的出现频率。你的实现应该支持如下操作:WordsFrequency(book)构造函数,参数为字符串数组构成的一本书get(word)查询指定单词在书中出现的频率示例:WordsFrequency wordsFrequency = new WordsFrequency({“i”, “have”, “an”, “apple”, “he”, “have”, “a”, “pen”});wordsFrequency.get(“you”); //返回0,"y原创 2021-09-09 16:48:58 · 122 阅读 · 0 评论 -
【面试题】 16.01. 交换数字
题目:编写一个函数,不用临时变量,直接交换numbers = [a, b]中a与b的值。示例:输入: numbers = [1,2]输出: [2,1]提示:numbers.length == 2-2147483647 <= numbers[i] <= 2147483647答案:class Solution { public int[] swapNumbers(int[] numbers) { numbers[0] = numbers[0] - number原创 2021-09-09 16:33:41 · 51 阅读 · 0 评论 -
【面试题】 10.03. 搜索旋转数组
题目:搜索旋转数组。给定一个排序后的数组,包含n个整数,但这个数组已被旋转过很多次了,次数不详。请编写代码找出数组中的某个元素,假设数组元素原先是按升序排列的。若有多个相同元素,返回索引值最小的一个。示例1:输入: arr = [15, 16, 19, 20, 25, 1, 3, 4, 5, 7, 10, 14], target = 5输出: 8(元素5在该数组中的索引)示例2:输入:arr = [15, 16, 19, 20, 25, 1, 3, 4, 5, 7, 10, 14], target原创 2021-09-09 16:26:54 · 106 阅读 · 0 评论 -
【面试题】 08.11. 硬币
题目:硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)示例1:输入: n = 5输出:2解释: 有两种方式可以凑成总金额:5=55=1+1+1+1+1示例2:输入: n = 10输出:4解释: 有四种方式可以凑成总金额:10=1010=5+510=5+1+1+1+1+110=1+1+1+1+1+1+1+1+1+1说明:注意:你可以假设:0 <= n (总金额) <原创 2021-09-09 16:13:13 · 137 阅读 · 0 评论 -
【面试题】 08.09. 括号
题目:括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。说明:解集不能包含重复的子集。例如,给出 n = 3,生成结果为:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]答案:class Solution { List<String> list; public List<String> generateParenthesis(int n) { //使用回溯法,当发现原创 2021-09-09 15:28:02 · 63 阅读 · 0 评论 -
【面试题】 08.08. 有重复字符串的排列组合
题目:有重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合。示例1:输入:S = “qqe”输出:[“eqq”,“qeq”,“qqe”]示例2:输入:S = “ab”输出:[“ab”, “ba”]提示:字符都是英文字母。字符串长度在[1, 9]之间。答案:class Solution { boolean[] used; List<String> res; int len; public String[] permutation(S原创 2021-09-09 15:03:54 · 520 阅读 · 0 评论 -
【面试题】 08.07. 无重复字符串的排列组合
题目:无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。示例1:输入:S = “qwe”输出:[“qwe”, “qew”, “wqe”, “weq”, “ewq”, “eqw”]示例2:输入:S = “ab”输出:[“ab”, “ba”]提示:字符都是英文字母。字符串长度在[1, 9]之间。答案:class Solution { boolean[] used; List<String> res; int len原创 2021-09-09 11:36:15 · 134 阅读 · 0 评论 -
【面试题】 04.12. 求和路径
题目:给定一棵二叉树,其中每个节点都含有一个整数数值(该值或正或负)。设计一个算法,打印节点数值总和等于某个给定值的所有路径的数量。注意,路径不一定非得从二叉树的根节点或叶节点开始或结束,但是其方向必须向下(只能从父节点指向子节点方向)。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回原创 2021-09-07 14:41:52 · 97 阅读 · 0 评论 -
【面试题】 08.04. 幂集
题目:幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []]答案:class Solution { public List<List<Integer>> subsets(int[] nums) { //迭代:先把当前的放进去原创 2021-09-02 16:41:13 · 134 阅读 · 0 评论 -
【面试题】 08.05. 递归乘法
题目:递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。示例1:输入:A = 1, B = 10输出:10示例2:输入:A = 3, B = 4输出:12提示:保证乘法范围不会溢出答案:class Solution { public int multiply(int A, int B) { //我们可以把a×b看成十进制下的a×二进制下的b //把b按照二进制下的位拆开来,于是就只要用加原创 2021-09-01 00:16:10 · 188 阅读 · 0 评论 -
【面试题】 08.02. 迷路的机器人
题目:设想有个机器人坐在一个网格的左上角,网格 r 行 c 列。机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径。网格中的障碍物和空位置分别用 1 和 0 来表示。返回一条可行的路径,路径由经过的网格的行号和列号组成。左上角为 0 行 0 列。如果没有可行的路径,返回空数组。示例 1:输入:[ [0,0,0], [0,1,0], [0,0,0]]输出: [[0,0],[0,1],[0,2],[1,2],[2,2原创 2021-08-31 20:44:07 · 129 阅读 · 0 评论 -
【面试题】 05.08. 绘制直线
题目:绘制直线。有个单色屏幕存储在一个一维数组中,使得32个连续像素可以存放在一个 int 里。屏幕宽度为w,且w可被32整除(即一个 int 不会分布在两行上),屏幕高度可由数组长度及屏幕宽度推算得出。请实现一个函数,绘制从点(x1, y)到点(x2, y)的水平线。给出数组的长度 length,宽度 w(以比特为单位)、直线开始位置 x1(比特为单位)、直线结束位置 x2(比特为单位)、直线所在行数 y。返回绘制过后的数组。示例1:输入:length = 1, w = 32, x1 = 30,原创 2021-08-30 11:28:16 · 160 阅读 · 0 评论 -
【面试题】 05.02. 二进制数转字符串
题目:二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。示例1:输入:0.625输出:“0.101”示例2:输入:0.1输出:“ERROR”提示:0.1无法被二进制准确表示提示:32位包括输出中的"0."这两位。答案:class Solution { public String printBin(double num) { //按顺序来判断原创 2021-08-30 11:05:34 · 221 阅读 · 0 评论 -
【面试题】 04.10. 检查子树
题目:检查子树。你有两棵非常大的二叉树:T1,有几万个节点;T2,有几万个节点。设计一个算法,判断 T2 是否为 T1 的子树。如果 T1 有这么一个节点 n,其子树与 T2 一模一样,则 T2 为 T1 的子树,也就是说,从节点 n 处把树砍断,得到的树与 T2 完全相同。注意:此题相对书上原题略有改动。示例1:输入:t1 = [1, 2, 3], t2 = [2]输出:true示例2:输入:t1 = [1, null, 2, 4], t2 = [3, 2]输出:false提示:树的节原创 2021-08-30 10:58:53 · 57 阅读 · 0 评论 -
【面试题】 02.04. 分割链表
题目:给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你不需要 保留 每个分区中各节点的初始相对位置。示例 1:输入:head = [1,4,3,2,5,2], x = 3输出:[1,2,2,4,3,5]示例 2:输入:head = [2,1], x = 2输出:[1,2]提示:链表中节点的数目在范围 [0, 200] 内-100 <= Node.val <= 100-200 <原创 2021-08-30 10:48:31 · 107 阅读 · 0 评论 -
【面试题】 03.03. 堆盘子
题目:堆盘子。设想有一堆盘子,堆太高可能会倒下来。因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。请实现数据结构SetOfStacks,模拟这种行为。SetOfStacks应该由多个栈组成,并且在前一个栈填满时新建一个栈。此外,SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同(也就是说,pop()返回的值,应该跟只有一个栈时的情况一样)。 进阶:实现一个popAt(int index)方法,根据指定的子栈,执行pop操作。当某个栈为空时,应原创 2021-08-30 10:14:46 · 112 阅读 · 0 评论 -
【面试题】 02.05. 链表求和
题目:给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。示例:输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295输出:2 -> 1 -> 9,即912进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?示例:输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295输出:原创 2021-07-23 16:54:22 · 62 阅读 · 1 评论 -
【面试题】 01.08. 零矩阵
题目:编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。示例 1:输入:[ [1,1,1], [1,0,1], [1,1,1]]输出:[ [1,0,1], [0,0,0], [1,0,1]]示例 2:输入:[ [0,1,2,0], [3,4,5,2], [1,3,1,5]]输出:[ [0,0,0,0], [0,4,5,0], [0,3,1,0]]答案:class Solution { publ原创 2021-07-23 16:36:44 · 126 阅读 · 0 评论 -
【面试题】 01.07. 旋转矩阵
题目:给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。不占用额外内存空间能否做到?示例 1:给定 matrix =[ [1,2,3], [4,5,6], [7,8,9]],原地旋转输入矩阵,使其变为:[ [7,4,1], [8,5,2], [9,6,3]]示例 2:给定 matrix =[ [ 5, 1, 9,11], [ 2, 4, 8,10], [13, 3, 6, 7],原创 2021-07-23 16:18:14 · 60 阅读 · 0 评论 -
【面试题】 05.04. 下一个数
题目:下一个数。给定一个正整数,找出与其二进制表达式中1的个数相同且大小最接近的那两个数(一个略大,一个略小)。示例1:输入:num = 2(或者0b10)输出:[4, 1] 或者([0b100, 0b1])示例2:输入:num = 1输出:[2, -1]提示:num的范围在[1, 2147483647]之间;如果找不到前一个或者后一个满足条件的正数,那么输出 -1。答案:class Solution { public int[] findClosedNumbers(int n原创 2021-07-23 16:00:45 · 150 阅读 · 0 评论 -
【面试题】 04.08. 首个共同祖先
题目:设计并实现一个算法,找出二叉树中某两个节点的第一个共同祖先。不得将其他的节点存储在另外的数据结构中。注意:这不一定是二叉搜索树。例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4] 3 / \ 5 1 / \ / \6 2 0 8 / \ 7 4示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节点 5 和节点 1 的最近原创 2021-07-23 15:26:04 · 115 阅读 · 0 评论 -
【面试题】 04.06. 后继者
题目:设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。如果指定节点没有对应的“下一个”节点,则返回null。示例 1:输入: root = [2,1,3], p = 1 2 / \1 3输出: 2示例 2:输入: root = [5,3,6,2,4,null,null,1], p = 6 5 / \ 3 6 / \ 2 4 / 1输出: null答案:/** * Definition for原创 2021-07-23 15:14:53 · 123 阅读 · 0 评论 -
【面试题】 04.05. 合法二叉搜索树
题目:实现一个函数,检查一棵二叉树是否为二叉搜索树。示例 1:输入: 2 / \ 1 3输出: true示例 2:输入: 5 / \ 1 4 / \ 3 6输出: false解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。答案:/** * Definition for a binary tree node. * public class TreeNode {原创 2021-07-22 17:05:05 · 54 阅读 · 1 评论