109道编程面试难题全解析与解答指南
我知道那种感觉。
你正面临一场重要的编程面试。
是的,你受过教育,尽己所能成为了软件开发者,一直在练习编码。
但即便如此,在大日子前的几周或几个月,你突然开始感到……毫无头绪。说实话——有点害怕,甚至不止一点!
那些刻薄的招聘人员会问你什么?
我经历过许多编程面试。最近我也站在了另一边——作为面试官。我甚至写了一本关于编程面试的书。
为什么编程面试这么难?
编程面试确实越来越难。程序员为了准备而学习更多,竞争更加激烈。面试官通过提出更难的问题来适应。
而且,在压力下编码本身就很有压力。问题通常太短,无法作为有效的筛选工具,反而会让优秀的程序员也感到困惑。
但……如果你聪明且有纪律地准备,你仍然可以主导那次面试!
彻底研究这些问题。
今天我将揭秘你在编程面试中会遇到的问题以及如何成功应对。
为了通过编程面试,你需要用真实的编程面试问题来准备。练习真实问题并学习它们的模式。
你会用知情、切中要点的答案给面试官留下深刻印象,让他们不雇用你就是愚蠢的。
世界需要更多拥有高薪工作的优秀程序员(就是你!!)——这样你才能继续让世界变得更美好。
我真诚地祝愿你。
祝你好运!
掌握5种编程面试问题类型
花点时间。
穿上问你编程面试问题的人的鞋子。
招聘人员想要全面了解。他们想知道:
- 你对基本编程概念的编码知识
- 你的编码技能,主要与数据结构(数组、字符串、链表、二叉树等)、概念(位操作、设计模式等)和算法相关
- 你的一般逻辑能力。当然,智力大多是遗传的。但任何人都可以通过练习逻辑谜题和精炼逻辑技能来充分发挥上帝赋予的智力水平
- 你的问题解决过程——这使你成为一个优秀的程序员,而不仅仅是“编码员”
- 你的个性——以及它如何适合他们公司的文化和目标。这些是所谓的“行为”面试问题
5个类别:
- 编码知识
- 编码技能
- 逻辑能力
- 问题解决
- 个性
为每个领域的问題做好准备。你会知道即将发生什么,并能够给出聪明的答案。
为这些类型的问题做好充分准备,参加你的编程面试(面对面或通过视频)。
这是你超越其他候选人的机会。
现在,来看看你需要掌握的5种编程面试问题类型:
1. 基础编程面试问题
在面试早期(以及整个过程中),面试官希望测试你的编程基础。
这些是关于一般编程术语、概念和函数的问题。
如果你在基础上挣扎,他们会很快将你从工作候选人名单中剔除。
面向新手的编程面试问题
如果你是期待第一次编程面试的新手,从本文中更基础的问题开始。一旦掌握了它们,你可以转向更困难的问题、难题和谜题。先处理“新手”问题,你就能为最高级的内容做好准备。但一切都建立在基础之上!
所以确保你理解这些基本编程概念:
前13个通用编码、设计和编程基础问题
看看你能连续回答多少个这些问题而不减速。
-
你选择的技术有哪些优缺点?
例如,如果你最喜欢的技术是Node.js——你需要能够彻底回答这个技术问题,因为它将显示你在这个特定领域的知识深度。
由于你更可能面试Node.js工作,优缺点经常被忽视。人们只是说,哦是的,我用JavaScript。我用Node。他们实际上不知道使用它的优点,也不知道缺点。当他们给出答案时,可能只是说“哦是的。面向对象。哦是的。内存管理好。”
不要含糊。要切中要点。
找出你技术的一些优缺点,更好的是,找出你简历上任何东西的优缺点。 -
什么是变量?
没有变量,你就没有程序。变量是程序中根据整体条件和程序正在做的“工作”而改变的值。变量是存储在程序中或“声明”的值,代表程序的工作数据集。变量 = 数据集 + 算法。
-
什么是继承?
继承是面向对象编程(OOP)语言的核心概念之一。它是一种机制,你可以从一个类派生另一个类,形成共享一组属性和方法的类层次结构。
你可以用它来声明不同类型的异常,向现有框架添加自定义逻辑,甚至将你的领域模型映射到数据库。 -
什么是多态性?
多态性允许编程中的新对象承担现有对象的属性。提供继承特征的对象称为“基类”或“超类”。
这是程序根据对象的类型或类不同处理对象的能力。想象一辆汽车 versus 一辆坦克。多态性将是一个为它们共有的系统提供蓝图并在两种车辆类型上工作的系统。 -
什么是指针?
指针包含其他值的内存地址。操作指针可以比操作指针引用的数据节省时间。这可以是编写操作数据程序的有效方式。
指针在C中经常使用,但在Java中较少使用。 -
命名四种存储类。
寄存器、静态、外部和自动。
- 寄存器:这些是保存在中央处理单元寄存器中的存储类。
- 静态:这是一种变量不改变的存储类。它在编程任务的开始阶段声明。
- 外部:一种对硬件(如设备驱动程序)本地的存储类。这些对编译器说:“如果我需要这个变量 again,从外部设备读取它以获取最新值。”
- 自动:一种块或函数定义局部变量的存储类。
-
什么是封装?
这是面向对象设计中最重要的概念之一。它涉及将一个类与一组指令捆绑在一起。在封装中,对象不仅包括其数据,还包括可以改变该数据的函数。封装可用于隐藏数据的性质,同时仍促进交互。
-
命名七种数据类型。
- 浮点
- 整数
- 字符串
- 浮点数
- 实数
- 字符
- 布尔值
-
命名六种数据结构类型。
- 链表
- 文件
- 栈
- 队列
- 树
- 图
-
特定函数或变量的“声明”和“定义”有什么区别?
声明涉及标识符的类型和功能,并描述链接器引用它需要什么。定义描述编译器与标识符交互需要做什么。有时声明提供初始值,有时定义提供值。
-
解释器和编译器有什么区别?
解释器直接执行命令,而编译器将这些命令(程序)从源代码转换为机器代码。编译的程序比解释语言运行更快,可以在规模上使用。
解释语言示例:Basic、Korn Shell、Ruby、Python
编译语言示例:Java、C++ -
面向对象设计的函数有哪些?
- 封装
- 多态性
- 继承
- 抽象
-
什么是实时操作系统?
实时操作系统(OS)在数据可用时处理数据,没有缓冲期。
实时OS示例:实时控制工厂机械。不一定是即时,但本质上是按需。
非实时OS示例:Windows和macOS。响应时间不那么重要。
2. 数据结构和算法面试问答
你需要彻底了解数据结构和算法。
是的,通过尝试解决这些问题,你会学到很多新概念。我仍然建议你在深入研究问题之前先刷新你对数据结构和算法的知识!
确保你可以从头创建它们。关于它们的问题可能是基础的或不是——你越能从头创建它们,就越容易回答任何关于它们的面试问题,无论是基础还是非基础。
如何处理任何技术编程问题
- 提问
- 创建算法
- 先写“伪”代码
- 不匆忙地编写代码
- 测试你的代码——仔细修复错误
(这是Gayle Laakmann的《破解编程面试》中概述的过程)
数据库问题:前7个
数据库编码可能涉及使用Python、Java和C#等语言来构建和实现基于Web、云和移动的应用程序,个人和组织可以使用这些应用程序与信息集合交互。
并非每个编程职业都需要数据库管理系统的专业知识。
但学习数据库的主要概念没有坏处。
-
定义“数据库”一词。数据库管理系统提供哪种交互?
数据库是任何包含数据并允许使用、访问、更新和处理数据的电子系统。
数据库管理系统(DBMS)允许管理员、应用程序、软件和最终用户与存储在数据库上的数据交互。 -
数据库管理系统如何改进基于文件系统的功能?
基于文件的系统可以直接由用户交互,但不一定是并发的。基于数据的管理在文件系统和正在使用的应用程序编程接口(API)之间提供中介,更可能同时促进多个用户。然而,这些用户不能同时更改相同的数据。
-
数据库技术的三种主要类型是什么?
- 结构/数据:在需要存储、操作或读取数据但不需要完整数据库实现时有用。
- 导航:导航数据库与分层或网络模型相关联。这描述了一个对象被迭代处理、一个接一个的数据库。
- SQL/关系:这代表“结构化查询语言”。用于检索或更新数据库中的信息。
-
规范化用于什么?
规范化重组数据以消除冗余并节省磁盘空间。它通过创建多个表并概述它们之间的关系来实现。
-
DDL和DML有什么区别?
DDL代表“数据定义语言”。它指定数据库的结构。DML代表“数据操作语言”,指的是如何从所述数据库中检索或修改数据。
-
为什么需要数据库分区?
分区通过创建分离、更稳定和更可用的单独文件系统来提高效率和数据可用性,并最小化数据丢失。分区允许并行处理或分离需要更频繁或更少访问的分区。
-
什么是实体——什么是实体集?
实体是离散对象或数据点,如人或地点。实体集将相同类型的实体分组。
在Java中,实体是类的实例。例如:类=“汽车”。实例/实体=“凯迪拉克CTS”。
数组编码面试问题
数组是编程中最常见的数据结构——也是决定如何访问信息的重要组成部分。如果你有变量作为基本构建块,数组是下一步。
这是面试官最喜欢的话题之一,你在任何编程面试中都会听到很多关于数组的问题,例如反转数组、排序数组或在数组上搜索元素。
数组数据结构的主要好处是,如果你知道索引,它提供快速的O(1)搜索,但从数组中添加和删除元素很慢,因为一旦创建了数组,你就无法更改数组的大小。
为了创建更短或更长的数组,你需要创建一个新数组并将所有元素从旧数组复制到新数组。
解决基于数组的问题的关键是拥有良好的数组数据结构知识以及基本编程构造,如循环、递归和基本运算符。
以下是你在编程面试中可能被问到的关于数组的前12个问题:
- 如何检查数组是否只包含数字?
- 如何找到给定数组的所有排列?
- 如何在1到100的给定整数数组中找到缺失的数字?(解决方案)
- 如何在给定整数数组上找到重复数字?(解决方案)
- 如何在未排序整数数组中找到最大和最小数字?(解决方案)
- 如何找到整数数组中所有和等于给定数字的对?(解决方案)
- 如果数组包含多个重复项,如何找到重复数字?(解决方案)
- 如何在Java中从给定数组中删除重复项?(解决方案)
- 如何使用快速排序算法就地对整数数组进行排序?(解决方案)
- 如何就地从数组中删除重复项?(解决方案)
- 如何在Java中就地反转数组?(解决方案)
- 如何在不使用任何库的情况下从数组中删除重复项?(解决方案)
树——前15个面试问题和答案
以下三个类别——树、图和列表——在某些基本方面相似,但它们仍然需要一些你可能在面试期间调用的专门知识。你有多了解线性和非线性数据结构?
在Java中,树包含描述如何操作列表的包。
现实世界中的所有信息都不能以线性方式表示,这就是树数据结构帮助的地方。
树数据结构是一种允许你以分层方式存储数据的数据结构。根据你存储数据的方式,有不同类型的树,例如二叉树,其中每个节点最多有两个子节点。
与其近亲二叉搜索树一起,它也是最流行的树数据结构之一。因此,你会发现很多基于它们的问题,例如如何遍历它们、计数节点、查找深度以及检查它们是否平衡。
解决二叉树问题的关键点是强大的理论知识,例如二叉树的大小或深度是什么,什么是叶,什么是节点,以及理解流行的遍历算法,例如前序、后序和中序遍历。
以下是软件工程师或开发人员面试中15个流行的基于二叉树的编码问题:
-
什么是二叉搜索树,它用于什么?
二叉树是一种具有两个“子节点”的数据结构,有助于研究分叉数据。
-
命名五种类型的树。
- 二叉树
- 二叉搜索树
- AVL树
- B树
- B+树
-
如何实现二叉搜索树?(解决方案)
-
如何在给定二叉树中执行前序遍历?(解决方案)
-
如何在没有递归的情况下在给定二叉树中执行前序遍历?(解决方案)
-
如何在给定二叉树中执行中序遍历?(解决方案)
-
如何在没有递归的情况下使用中序遍历打印给定二叉树的所有节点?(解决方案)
-
如何实现后序遍历算法?(解决方案)
-
如何在没有递归的情况下在二叉树中执行后序遍历?(解决方案)
-
如何打印二叉搜索树的所有叶节点?(解决方案)
-
如何计算给定二叉树中的叶节点数?(解决方案)
-
如何在给定数组中执行二叉搜索?(解决方案)
用树解决问题: 45. 如何镜像二叉树? 46. 如何计算给定二叉树中的叶节点数? 47. 如何检查树是否平衡?
图问题
图是由多个节点和边或“顶点”组成的非线性数据结构。图可以表示网络架构,并可用于解决实际问题。广义上,它们描述有向或无向关系。
-
什么是图的深度优先搜索或遍历?
深度优先搜索(DFS)通过从根节点开始并在回溯之前尽可能远地跟随每个分支来搜索图和树。DFS可用于检测图中的循环、查找路径以及定位强连通组件。
-
什么是图的广度优先遍历?
广度优先遍历(BFS)首先检查兄弟节点,然后检查子节点。BFS可用于对等网络中以查找最短路径,甚至可用于搜索引擎中的网络爬虫。
-
给定一个特定图,你如何确定它是否循环?
编程面试中的列表问题
链表是另一种常见的数据结构,是对数组数据结构的补充。
与数组类似,它也是一种线性数据结构,并以线性方式存储元素。
然而,与数组不同,它不在连续位置存储它们;相反,它们分散在内存中的各处,使用节点相互连接。
链表不过是一个节点列表,其中每个节点包含存储的值和下一个节点的地址。
由于这种结构,在链表中添加和删除元素很容易,因为你只需要更改链接而不是创建数组,但搜索很困难,通常需要O(n)时间在单链表中查找元素。
它还有多种变体,如:
- 单链表,允许你在一个方向(向前或反向)遍历
- 双链表,允许你在两个方向(向前和向后)遍历
- 循环链表,形成一个圆圈
解决基于链表的问题的关键是良好的递归知识,因为链表是递归数据结构。
如果你从链表中取出一个节点,剩余的数据结构仍然是一个链表,因此许多链表问题有比迭代解决方案更简单的递归解决方案。
以下是8个最常见和流行的链表面试问题及其解决方案:
- 如何在一遍中找到单链表的中间元素?(解决方案)
- 如何检查给定链表是否包含循环?如何找到循环的起始节点(解决方案)
- 如何反转链表?(解决方案)
- 如何在没有递归的情况下反转单链表?(解决方案)
- 如何从未排序链表中删除重复节点?(解决方案)
- 如何找到单链表的长度(解决方案)
- 如何找到单链表中倒数第三个节点?(解决方案)
- 如何使用栈找到两个链表的和?(解决方案)
算法面试问题
算法通常是编码专业人员职业生涯的面包和黄油。你知道它们是驱动数据收集、排序并最终在其他过程中变得有用的配方。
你可以期待与算法相关的问题,例如这7个:
- 如何实现冒泡排序算法?(解决方案)
- 如何实现迭代快速排序算法?(解决方案)
- 如何实现插入排序算法?(解决方案)
- 如何实现归并排序算法?(解决方案)
- 如何实现桶排序算法?(解决方案)
- 如何实现计数排序算法?(解决方案)
- 如何实现基数排序算法?(解决方案)
字符串编码面试问题
与数组和链表数据结构一起,字符串是编程工作面试中另一个流行的话题。我从未参加过没有基于字符串的问题的编程面试。
关于字符串的一个好处是,如果你了解数组,你可以轻松解决基于字符串的问题,因为字符串不过是字符数组。
因此,你通过解决基于数组的编码问题学到的所有技术都可以用于解决字符串编程问题。
以下是我从编程工作面试中收集的11个常问字符串编码问题列表:
- 如何从字符串中打印重复字符?(解决方案)
- 如何检查两个字符串是否是彼此的字谜?(解决方案)
- 如何从字符串中打印第一个非重复字符?(解决方案)
- 如何使用递归反转给定字符串?(解决方案)
- 如何检查字符串是否只包含数字?(解决方案)
- 如何在字符串中找到重复字符?(解决方案)
- 如何计算给定字符串中的元音和辅音数量?(解决方案)
- 如何计算字符串中给定字符的出现次数?(解决方案)
- 如何找到字符串的所有排列?(解决方案)
- 如何在不使用任何库方法的情况下反转给定句子中的单词?(解决方案)
- 如何检查两个字符串是否是