编程面试必看:109个技术问题与解答全解析

本文全面解析编程面试中的109个核心技术问题,涵盖数据结构、算法、数据库、字符串处理等关键领域,并提供详细解答和解题思路,帮助开发者系统准备技术面试。

编程面试必看:109个技术问题与解答全解析

面试准备的核心要素

编程面试变得越来越难。程序员需要更多准备,竞争也更加激烈。面试官通过提出更难的问题来适应这一趋势。在压力下编码本身就很有压力,而问题通常设计得过于简短,反而可能绊倒优秀的程序员。

但如果你聪明且有纪律地准备,你仍然可以主导面试!深入研究这些问题,掌握它们的模式。

五大编程面试问题类型

1. 基础编程问题

面试早期(以及整个过程中),面试官会测试你的编程基础。这些问题涉及通用编程术语、概念和函数。如果在基础问题上挣扎,你可能会很快被排除在候选人名单之外。

新手程序员应关注的问题: 确保你理解以下基本编程概念:

13个通用编程与设计基础问题

  1. 选择技术的优缺点是什么? 例如,如果你最喜欢的技术是Node.js,你需要能够全面回答这个技术问题,以展示你在该领域的深度知识。

  2. 什么是变量? 变量是程序中根据整体条件和程序正在执行的“工作”而改变的值。变量是存储在程序中或“声明”的值,代表程序的工作数据集。变量 = 数据集 + 算法。

  3. 什么是继承? 继承是面向对象编程(OOP)语言的核心概念之一。它是一种机制,可以从另一个类派生一个类,形成共享一组属性和方法的类层次结构。

  4. 什么是多态性? 多态性允许编程中的新对象承担现有对象的属性。提供继承特征的对象称为“基类”或“超类”。这是程序根据对象的类型或类以不同方式处理对象的能力。

  5. 什么是指针? 指针包含其他值的内存地址。操作指针可以比操作指针引用的数据节省时间。这可以是编写操作数据程序的有效方式。指针在C中经常使用,但在Java中较少使用。

  6. 命名四种存储类。 寄存器、静态、外部和自动。

  7. 什么是封装? 这是面向对象设计中最重要的概念之一。它涉及将一个类与一组指令捆绑在一起。在封装中,对象不仅包括其数据,还包括可以改变该数据的函数。封装可用于隐藏数据的性质,同时促进交互。

  8. 命名七种数据类型。 浮点、整数、字符串、浮点数、实数、字符、布尔值。

  9. 命名六种数据结构类型。 链表、文件、栈、队列、树、图。

  10. 特定函数或变量的“声明”和“定义”有什么区别? 声明涉及标识符的类型和功能,并描述链接器引用它所需的内容。定义描述编译器与标识符交互所需的内容。有时声明提供初始值,有时定义提供值。

  11. 解释器和编译器有什么区别? 解释器直接执行命令,而编译器将这些命令(程序)从源代码转换为机器代码。编译的程序比解释性语言运行得更快,并且可以大规模使用。

  12. 面向对象设计的函数是什么? 封装、多态性、继承、抽象。

  13. 什么是实时操作系统? 实时操作系统(OS)在数据可用时处理数据,没有缓冲期。

2. 数据结构与算法问题

你需要深入了解数据结构和算法。确保你可以从头开始创建它们。关于它们的问题可能是基础的,也可能不是——你越能从头开始创建它们,就越容易回答任何关于它们的面试问题,无论是基础还是非基础。

如何应对任何技术编程问题:

  • 提问
  • 创建算法
  • 先写“伪”代码
  • 不匆忙地编写代码
  • 测试你的代码——仔细修复错误

数据库问题:前7个

  1. 定义“数据库”一词。数据库管理系统提供哪种交互? 数据库是任何包含数据并允许使用、访问、更新和处理数据的电子系统。数据库管理系统(DBMS)允许管理员、应用程序、软件和最终用户与存储在数据库上的数据交互。

  2. 数据库管理系统如何改进基于文件的系统的功能? 基于文件的系统可以直接由用户交互,但不一定是并发的。基于数据的管理在文件系统和正在使用的应用程序编程接口(API)之间提供中介,并且更可能同时促进多个用户。然而,这些用户不能同时更改相同的数据。

  3. 数据库技术的三种主要类型是什么? 结构/数据、导航、SQL/关系。

  4. 规范化用于什么? 规范化重组数据以消除冗余并节省磁盘空间。它通过创建多个表并概述它们之间的关系来实现。

  5. DDL和DML有什么区别? DDL代表“数据定义语言”。它指定数据库的结构。DML代表“数据操作语言”,指的是如何从所述数据库中检索或修改数据。

  6. 为什么需要数据库分区? 分区通过创建单独、更稳定和更可用的单独文件系统来提高效率和数据可用性,并最小化数据丢失。分区允许并行处理或分离需要更频繁或更少访问的分区。

  7. 什么是实体——什么是实体集? 实体是离散对象或数据点,例如人或地点。实体集将相同类型的实体分组。

数组编程面试问题

数组是编程中最常见的数据结构——也是决定如何访问信息的重要组成部分。如果你有变量作为基本构建块,数组是下一步。

数组数据结构的关键好处: 它提供快速的O(1)搜索(如果你知道索引),但从数组中添加和删除元素很慢,因为一旦创建就无法更改数组的大小。为了创建更短或更长的数组,你需要创建一个新数组并将所有元素从旧数组复制到新数组。

解决基于数组的问题的关键: 拥有良好的数组数据结构知识以及基本编程构造器,如循环、递归和基本运算符。

前12个数组问题: 21. 如何检查数组是否仅包含数字? 22. 如何找到给定数组的所有排列? 23. 如何在1到100的给定整数数组中找到缺失的数字?(解决方案) 24. 如何在给定整数数组中找到重复的数字?(解决方案) 25. 如何在未排序的整数数组中找到最大和最小的数字?(解决方案) 26. 如何找到整数数组中所有和等于给定数字的对?(解决方案) 27. 如果数组包含多个重复项,如何找到重复数字?(解决方案) 28. 如何在Java中从给定数组中删除重复项?(解决方案) 29. 如何使用快速排序算法就地排序整数数组?(解决方案) 30. 如何就地删除数组中的重复项?(解决方案) 31. 如何在Java中就地反转数组?(解决方案) 32. 如何在不使用任何库的情况下从数组中删除重复项?(解决方案)

树——前15个面试问题和答案

以下三个类别——树、图和列表——在某些基本方面相似,但它们仍然需要一些你可能在面试期间调用的专门知识。你有多了解线性和非线性数据结构?

在Java中,树包含描述如何操作列表的包。现实世界中的所有信息都不能以线性方式表示,这就是树数据结构有所帮助的地方。

树数据结构是一种允许你以分层方式存储数据的数据结构。根据存储数据的方式,有不同类型的树,例如二叉树,其中每个节点最多有两个子节点。

与其近亲二叉搜索树一起,它也是最流行的树数据结构之一。因此,你会找到很多基于它们的问题,例如如何遍历它们、计数节点、查找深度以及检查它们是否平衡。

解决二叉树问题的关键点: 强大的理论知识,例如二叉树的大小或深度是什么,什么是叶子,什么是节点,以及理解流行的遍历算法,例如前序、后序和中序遍历。

15个流行的基于二叉树的编码问题: 33. 什么是二叉搜索树,它用于什么? 二叉树是一种具有两个“子节点”的数据结构,并促进分叉数据的研究。

  1. 命名五种类型的树。 二叉树、二叉搜索树、AVL树、B树、B+树。

  2. 如何实现二叉搜索树?(解决方案)

  3. 如何在给定二叉树中执行前序遍历?(解决方案)

  4. 如何在没有递归的情况下在给定二叉树中执行前序遍历?(解决方案)

  5. 如何在给定二叉树中执行中序遍历?(解决方案)

  6. 如何在没有递归的情况下使用中序遍历打印给定二叉树的所有节点?(解决方案)

  7. 如何实现后序遍历算法?(解决方案)

  8. 如何在没有递归的情况下在二叉树中执行后序遍历?(解决方案)

  9. 如何打印二叉搜索树的所有叶子?(解决方案)

  10. 如何计算给定二叉树中的叶子节点数?(解决方案)

  11. 如何在给定数组中执行二分搜索?(解决方案)

问题解决与树: 45. 如何镜像二叉树? 46. 如何计算给定二叉树中的叶子节点数? 47. 如何检查树是否平衡?

图问题

图是由多个节点和边或“顶点”组成的非线性数据结构。图可以表示网络架构,并可用于解决实际问题。广义上,它们描述有向或无向关系。

  1. 什么是图的深度优先搜索或遍历? 深度优先搜索(DFS)通过从根节点开始并在回溯之前尽可能远地跟随每个分支来搜索图和树。DFS可用于检测图中的循环、查找路径以及定位强连通组件。

  2. 什么是图的广度优先遍历? 广度优先遍历(BFS)首先检查兄弟节点,然后检查子节点。BFS可用于对等网络中以查找最短路径,甚至可用于搜索引擎中使用的网络爬虫。

  3. 给定一个特定的图,你如何确定它是否循环?

列表编程面试问题

链表是另一种常见的数据结构,补充了数组数据结构。与数组类似,它也是一种线性数据结构,并以线性方式存储元素。然而,与数组不同,它不在连续位置存储它们;相反,它们分散在内存中的各处,使用节点相互连接。

链表不过是节点列表,其中每个节点包含存储的值和下一个节点的地址。

由于这种结构,在链表中添加和删除元素很容易,因为你只需要更改链接而不是创建数组,但搜索很困难,并且通常需要O(n)时间才能在单链表中找到一个元素。

它还有多种变体:

  • 单链表:允许你在一个方向(向前或向后)遍历
  • 双链表:允许你在两个方向(向前和向后)遍历
  • 循环链表:形成一个圆圈

解决基于链表的问题的关键: 良好的递归知识很重要,因为链表是递归数据结构。如果你从链表中取出一个节点,剩余的数据结构仍然是一个链表,因此许多链表问题具有比迭代解决方案更简单的递归解决方案。

8个最常见和流行的链表面试问题及其解决方案: 51. 如何在一遍中找到单链表的中间元素?(解决方案) 52. 如何检查给定链表是否包含循环?如何找到循环的起始节点(解决方案) 53. 如何反转链表?(解决方案) 54. 如何在没有递归的情况下反转单链表?(解决方案) 55. 如何从未排序的链表中删除重复节点?(解决方案) 56. 如何找到单链表的长度(解决方案) 57. 如何找到单链表中倒数第三个节点?(解决方案) 58. 如何使用栈找到两个链表的和?(解决方案)

算法面试问题

算法通常是编码专业人员职业生涯的面包和黄油。你知道它们是驱动数据如何收集、排序并最终在其他过程中变得有用的配方。

你可以期待与算法相关的问题,例如这7个: 59. 如何实现冒泡排序算法?(解决方案) 60. 如何实现迭代快速排序算法?(解决方案) 61. 如何实现插入排序算法?(解决方案) 62. 如何实现归并排序算法?(解决方案) 63. 如何实现桶排序算法?(解决方案) 64. 如何实现计数排序算法?(解决方案) 65. 如何实现基数排序算法?(解决方案)

字符串编程面试问题

与数组和链表数据结构一起,字符串是编程工作面试中另一个流行的话题。我从未参加过没有提出基于字符串的问题的编码面试。

关于字符串的一个好处是,如果你了解数组,你可以轻松解决基于字符串的问题,因为字符串不过是字符数组。因此,你通过解决基于数组的编码问题学到的所有技术都可以用于解决字符串编程问题。

11个经常被问到的字符串编码问题: 66. 如何从字符串中打印重复字符?(解决方案) 67. 如何检查两个字符串是否是彼此的字谜?(解决方案) 68. 如何从字符串中打印第一个非重复字符?(解决方案) 69. 如何使用递归反转给定字符串?(解决方案) 70. 如何检查字符串是否仅包含数字?(解决方案) 71. 如何在字符串中找到重复字符?(解决方案) 72. 如何计算给定字符串中的元音和辅音数量?(解决方案) 73. 如何计算字符串中给定字符的出现次数?(解决方案) 74. 如何找到字符串的所有排列?(解决方案) 75. 如何在不使用任何库方法的情况下反转给定句子中的单词?(解决方案) 76. 如何检查两个字符串是否是彼此的旋转?(解决方案) 77. 如何检查给定字符串是否是回文?(解决方案)

这些问题帮助你提高对字符串作为数据结构的理解。如果你觉得对二叉树编码的理解不足,无法自行解决这些问题,我建议你回去挑选一本好的数据结构和算法书。

3. 编程面试逻辑问题与解决方案

除了基于数据结构的问题之外,大多数编程工作面试还会询问一般的逻辑问题,我将在本节中描述。练习这些概念很重要,因为有时它们在实际面试中变得棘手。事先练习它们不仅使你熟悉它们,还让你更有信心向面试官解释解决方案。

9个逻辑与数学问题: 78. 如何在不使用第三个变量的情况下交换两个数字?(解决方案) 79. 如何检查两个矩形是否彼此重叠?(解决方案) 80. 如何设计自动售货机?(解决方案)

逻辑数学和概率面试问题: 81. 检查数字是否为偶数的公式是什么? num % 2 == 0

  1. 1到N的和的公式是什么? 1 + 2 + … + (N – 1) + N = (N+1) * N/2

  2. 几何级数和的数学公式是什么? 20 + 21 + 22 + 23 + … 2n = 2n+1 – 1

  3. 给定两个公平的骰子,两个骰子总和为8的概率是多少? 有36(6*6)种结果用于投掷两个公平的骰子,两个骰子总和为8的结果是: (2, 6), (3,5), (4,4), (5,3), (6,2); 两个骰子总和为8的概率是5/36。

  4. 有100个人站成一个圆圈。站在第1位的人杀死下一个人(即站在第2位的人)并将剑交给下下个人(即站在第3位的人)。最后哪个人存活? 如果总人数不是2的幂,那么定义在以下等差数列中第n位的人将始终存活。 等差数列(X)= a + d * ( n – 1 ) 其中,a = 3 d = 2 n = 总人数 - 小于总人数的2的最大n次根 所以对于100人的圆圈: X = 3 + 2 * ( 100 -64 – 1 ) = 73

  5. 如何检查素数?(解决方案)

4. 软件工程师或编码员工作的问题解决面试问题

一些编程面试会构建某种实践、动手或问题解决的演示,以查看你如何即兴发挥并将主要和次要编程概念结合在一起。请记住,对于任何类型的程序员来说,最重要的底层技能是逻辑思考的能力。

11个问题解决练习: 87. 这是一个涉及随机选择的问题示例: 如果你有一个52个数字的数组,例如一副牌,很容易随机选择一个。你的任务是生成一个1到52之间的数字,并将其用作数组的索引。换句话说,推导一个系统,其中从所有数字或牌等概率的集合或牌组中选择一个数字或牌。

  1. 这是一个更难的变体: 想象你既不能一次看到整个集合,也不能存储它。换句话说,你不会被告知总共有多少数字,并且一次只显示一个数字。你不能存储所有显示的数字,并且只在你看到集合的最终数字时被告知。 如果你最多允许存储两个数字,你能在被告知流完成时立即以等概率方式响应一个随机数字吗?

  2. 如何解决这个问题: 你只需要存储两个数字:到目前为止看到的数字的总计数,以及你当前的候选响应,如果流在此时结束,则从数字流中选择。 当你显示第一个数字时,你有一个计数为一。因此,你的候选响应必须是第一个也是唯一看到的数字——它的概率是一分之一。如果你显示第二个数字,它成为你的新候选响应,概率为二分之一。同样,第三个数字将成为新候选响应,概率为三分之一,依此类推。 因此,当每个新数字被看到时,生成一个一到此时看到的数据点数量(N)之间的随机数。如果你的随机数等于N,则将刚刚呈现的数字保留为你的新可能响应。否则,通过相同的逻辑保留先前保存的答案。 每次看到新数据点时,你执行此选择更新。当你被告知流完成时,保存的值是正确的响应,从所有看到的数字中等概率选择。概率是1/N,无论流停止之前有多少。

其他问题: 90. 编写算法以在文本选择中找到给定单词的每个实例。 91. 编写程序以在给定范围内生成随机数。 92. 如何检查字符串是否仅包含数字? 93. 给定两个字符字符串,找到将字符串1转换为字符串2所需的最小更改次数。 94. 如何计算给定字符串中的元音和辅音数量? 95. 给定每个方格都有数值的网格,如何编写解决方案以找到从网格一侧到另一侧的最低值路线?

可扩展性问题解决: 96. 查找包含单词列表的所有文档 97. 为社交媒体网络设计数据结构(解决方案)

5. 行为编程面试问题——你如何适应他们的文化?

通过在编程面试中询问所谓的行为问题,他们试图弄清楚你的个性是否适合他们公司的文化。如果你傲慢,当有人批评你时很快变得好争辩和防御性,或者你开始责怪他人,他们会将其作为拒绝你工作的理由。

软件开发者软技能问题——研究它们! 虽然你的编程面试大部分是关于你的编码技能和分析能力——但花时间准备这些“较软”的问题是值得的。招聘人员可能还会询问你简历中的一些点。因此,为此做好准备也是有意义的。

快速提示: 在我们关于程序员软技能的文章中,我们更深入地探讨了你在编程面试中成功所需的行为属性——以及通常你的职业生涯。

前7个行为与软技能编程面试问题: 98. 你的弱点是什么? 当他们询问你的弱点时,给他们一个你实际的弱点!不要给出你的

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计