109个编程面试难题全解析与答案

本文全面解析109个编程面试常见问题,涵盖基础编程概念、数据结构、算法、逻辑题及行为面试题。每个问题均提供详细解答,帮助开发者系统准备技术面试,提升通过率。

109个编程面试难题全解析与答案

我知道那种感觉。
你正面临一场重要的编程面试。
是的,你受过教育,尽己所能成为了软件开发者,一直在练习编码。
但即便如此,在大日子前的几周或几个月,你突然开始感到……毫无头绪。说实话——有点害怕,甚至不止一点!

那些苛刻的招聘官会问你什么?

我经历过许多编程面试。最近我也站在了另一边——作为面试官。我甚至写了一本关于编程面试的书。

为什么编程面试这么难?

编程面试确实越来越难。程序员为了准备而学习更多,竞争越来越激烈。面试官通过提出更难的问题来适应。
而且,在压力下编码本身就很有压力。问题通常过于简短,无法作为有效的筛选工具,反而会让优秀的程序员出错。

但……如果你聪明且有纪律地准备,你仍然可以主导面试!
彻底研究这些问题。

今天我将揭秘你在编程面试中会遇到的问题以及如何成功应对。
为了通过编程面试,你需要用真实的编程面试问题来准备。练习真实问题并学习它们的模式。
你会用知情、切中要点的答案给面试官留下深刻印象,让他们觉得不雇用你是愚蠢的。

世界需要更多有高薪工作的优秀程序员(就是你!!)——这样你才能继续让世界变得更美好。
我真诚地祝愿你。
祝你好运!

需要掌握的5类编程面试问题

花点时间。
站在问你编程面试问题的人的角度。
招聘官想要全面了解。他们想知道:

  • 你对基本编程概念的编码知识
  • 你的编码技能,主要与数据结构(数组、字符串、链表、二叉树等)、概念(位操作、设计模式等)和算法相关
  • 你的一般逻辑能力。当然,智力大多是遗传的。但任何人都可以通过练习逻辑谜题和精炼逻辑技能来充分发挥天赋的智力水平
  • 你的问题解决过程——这让你成为优秀的程序员,而不仅仅是“编码员”
  • 你的个性——以及它如何适应公司的文化和目标。这些是所谓的“行为”面试问题

5个类别:

  1. 编码知识
  2. 编码技能
  3. 逻辑能力
  4. 问题解决
  5. 个性

为每个领域的问題做好准备。你会知道即将面对什么,并能给出聪明的答案。
为这些类型的问题做好充分准备,参加你的编程面试(现场或视频)。
这是你超越其他候选人的机会。

现在,来看看你需要掌握的5类编程面试问题:

1. 基础编程面试问题

在面试早期(以及整个过程中),面试官希望测试你的编程基础。
这些是关于一般编程术语、概念和函数的问题。
如果你在基础上挣扎,他们会很快将你从求职者名单中剔除。

面向新手的编程面试问题

如果你是期待第一次编程面试的新手,从本文中更基础的问题开始。一旦掌握了它们,你可以转向更困难的问题、问题和谜题。先处理“新手”问题,你就能为最高级的内容做好准备。但一切都建立在基础上!

所以确保你理解这些基本编程概念:

前13个通用编码、设计和编程基础问题

看看你能连续回答多少这些问题而不减速。

  1. 你选择的技术有哪些优缺点?

    例如,如果你最喜欢的技术是Node.js——你需要能够彻底回答这个技术问题,因为它会显示你在这个特定领域的知识深度。
    由于你更可能面试Node.js工作,优缺点经常被忽视。人们只是说,哦是的,我用JavaScript。我用Node。他们实际上不知道使用它的优点,也不知道缺点。当他们给出答案时,可能只是说“哦是的。面向对象。哦是的。内存管理好。”
    不要模糊。要切中要点。
    找出你技术的一些优缺点,更好的是,找出你简历上任何东西的优缺点。

  2. 什么是变量?

    没有变量,你就没有程序。变量是程序中根据整体条件和程序正在做的“工作”而改变的值。变量是存储在程序中或“声明”的值,代表程序的工作数据集。变量 = 数据集 + 算法。

  3. 什么是继承?

    继承是面向对象编程(OOP)语言的核心概念之一。它是一种机制,你可以从一个类派生另一个类,形成共享一组属性和方法的类层次结构。
    你可以用它来声明不同类型的异常,向现有框架添加自定义逻辑,甚至将你的领域模型映射到数据库。

  4. 什么是多态性?

    多态性允许编程中的新对象承担现有对象的属性。提供继承特征的对象称为“基类”或“超类”。
    这是程序根据对象的类型或类以不同方式处理对象的能力。想象一辆汽车 versus 一辆坦克。多态性将是一个为它们共有系统提供蓝图并在两种车辆类型上工作的系统。

  5. 什么是指针?

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

  6. 命名四种存储类。

    寄存器、静态、外部和自动。

    • 寄存器:这些是保存在中央处理单元寄存器中的存储类。
    • 静态:这是一种变量不改变的存储类。它在编程任务的开始阶段声明。
    • 外部:一种对硬件(如设备驱动程序)本地的存储类。这些对编译器说:“如果我需要这个变量 again,从外部设备读取以获取最新值。”
    • 自动:一种块或函数定义局部变量的存储类。
  7. 什么是封装?

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

  8. 命名七种数据类型。

    • 浮点
    • 整数
    • 字符串
    • 浮点数
    • 实数
    • 字符
    • 布尔值
  9. 命名六种数据结构类型。

    • 链表
    • 文件
    • 队列
  10. 特定函数或变量的“声明”和“定义”有什么区别?

    声明涉及标识符的类型和功能,并描述链接器引用它需要什么。定义描述编译器与标识符交互需要做什么。有时声明提供初始值,有时定义提供值。

  11. 解释器和编译器有什么区别?

    解释器直接执行命令,而编译器将这些命令(程序)从源代码转换为机器代码。编译的程序比解释语言运行更快,可以大规模使用。
    解释语言示例:Basic、Korn Shell、Ruby、Python
    编译语言示例:Java、C++

  12. 面向对象设计的功能有哪些?

    • 封装
    • 多态性
    • 继承
    • 抽象
  13. 什么是实时操作系统?

    实时操作系统(OS)在处理数据时无需缓冲期即可处理数据。
    实时操作系统示例:实时控制工厂机械。不一定是即时,但基本上是按需。
    非实时操作系统示例:Windows和macOS。响应时间不那么重要。

2. 数据结构和算法面试问答

你需要彻底了解数据结构和算法。
是的,通过尝试解决这些问题,你会学到很多新概念。我仍然建议你在深入研究问题之前先刷新数据结构和算法的知识!
确保你可以从头开始创建它们。关于它们的问题可能是基础的也可能不是——你越能从头开始创建它们,就越容易回答任何关于它们的面试问题,无论是基础还是非基础。

如何处理任何技术编程问题

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

(这是Gayle Laakmann的《破解编程面试》中概述的过程)

数据库问题:前7个

数据库编码可能涉及使用Python、Java和C#等语言来构建和实现基于Web、云和移动的应用程序,供个人和组织用于与信息集合交互。
并非每个编程职业都需要数据库管理系统的专业知识。
但学习数据库的主要概念没有坏处。

  1. 定义“数据库”一词。数据库管理系统提供哪种交互?

    数据库是任何包含数据并允许使用、访问、更新和处理数据的电子系统。
    数据库管理系统(DBMS)允许管理员、应用程序、软件和最终用户与存储在数据库上的数据交互。

  2. 数据库管理系统如何改进基于文件系统的功能?

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

  3. 数据库技术的三种主要类型是什么?

    • 结构/数据:在编写需要存储、操作或读取数据但不需要完整数据库实现的程序时有用。
    • 导航:导航数据库与分层或网络模型相关联。这描述了一个对象被迭代处理、一个接一个的数据库。
    • SQL/关系:这代表“结构化查询语言”。用于检索或更新数据库中的信息。
  4. 规范化用于什么?

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

  5. DDL和DML有什么区别?

    DDL代表“数据定义语言”。它指定数据库的结构。DML代表“数据操作语言”,指的是如何从所述数据库检索或修改数据。

  6. 为什么需要数据库分区?

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

  7. 什么是实体——什么是实体集?

    实体是离散对象或数据点,如人或地方。实体集将相同类型的实体分组。
    在Java中,实体是类的实例。例如:类=“汽车”。实例/实体=“凯迪拉克CTS”。

数组编程面试问题

数组是编程中最常见的数据结构——也是决定如何访问信息的重要组成部分。如果你有变量作为基本构建块,数组是下一步。
这是面试官最喜欢的话题之一,在任何编程面试中你都会听到很多关于数组的问题,例如反转数组、排序数组或搜索数组中的元素。
数组数据结构的主要好处是,如果你知道索引,它提供快速的O(1)搜索,但从数组中添加和删除元素很慢,因为一旦创建就无法更改数组的大小。
为了创建更短或更长的数组,你需要创建一个新数组并将所有元素从旧数组复制到新数组。

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

以下是你在编程面试中可能被问到的关于数组的前12个问题:

  1. 如何检查数组是否只包含数字?
  2. 如何找到给定数组的所有排列?
  3. 如何在1到100的给定整数数组中找到缺失的数字?(解决方案)
  4. 如何在给定整数数组中找到重复数字?(解决方案)
  5. 如何在未排序整数数组中找到最大和最小数字?(解决方案)
  6. 如何找到整数数组中所有和等于给定数字的对?(解决方案)
  7. 如果数组包含多个重复项,如何找到重复数字?(解决方案)
  8. 如何在Java中从给定数组中删除重复项?(解决方案)
  9. 如何使用快速排序算法对整数数组进行原地排序?(解决方案)
  10. 如何原地删除数组中的重复项?(解决方案)
  11. 如何在Java中原地反转数组?(解决方案)
  12. 如何在不使用任何库的情况下从数组中删除重复项?(解决方案)

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

以下三个类别——树、图和列表——在某些基本方面相似,但它们仍然需要一些你可能在面试中调用的专门知识。你有多了解线性和非线性数据结构?
在Java中,树包含描述如何操作列表的包。
现实世界中的所有信息都不能以线性方式表示,这就是树数据结构帮助的地方。
树数据结构是一种允许你以分层方式存储数据的数据结构。根据存储数据的方式,有不同类型的树,例如二叉树,其中每个节点最多有两个子节点。
与其近亲二叉搜索树一起,它也是最流行的树数据结构之一。因此,你会找到许多基于它们的问题,例如如何遍历它们、计数节点、查找深度以及检查它们是否平衡。
解决二叉树问题的关键点是强大的理论知识,例如二叉树的大小或深度是什么,什么是叶,什么是节点,以及对流行遍历算法的理解,例如前序、后序和中序遍历。

以下是软件工程师或开发人员工作面试中15个流行的基于二叉树的编码问题:

  1. 什么是二叉搜索树,它用于什么?

    二叉树是一种有两个“子节点”的数据结构,便于研究分叉的数据。

  2. 命名五种类型的树。

    • 二叉树
    • 二叉搜索树
    • AVL树
    • B树
    • B+树
  3. 如何实现二叉搜索树?(解决方案)

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

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

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

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

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

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

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

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

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

用树解决问题:

  1. 如何镜像二叉树?
  2. 如何计算给定二叉树中的叶节点数?
  3. 如何检查树是否平衡?

图问题

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

  1. 什么是图的深度优先搜索或遍历?

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

  2. 什么是图的广度优先遍历?

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

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

编程面试中的列表问题

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

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

由于这种结构,在链表中添加和删除元素很容易,因为你只需要更改链接而不是创建数组,但搜索很困难,通常需要O(n)时间在单链表中找到元素。
它也有多种变体,如:

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

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

以下是8个最常见和流行的链表面试问题及其解决方案:

  1. 如何在一遍中找到单链表的中间元素?(解决方案)
  2. 如何检查给定链表是否包含循环?如何找到循环的起始节点?(解决方案)
  3. 如何反转链表?(解决方案)
  4. 如何在没有递归的情况下反转单链表?(解决方案)
  5. 如何从未排序链表中删除重复节点?(解决方案)
  6. 如何找到单链表的长度?(解决方案)
  7. 如何找到单链表中倒数第三个节点?(解决方案)
  8. 如何使用栈找到两个链表的和?(解决方案)

算法面试问题

算法通常是编码专业人员职业生涯的面包和黄油。你知道它们是驱动数据收集、排序并最终在其他过程中变得有用的配方。
你可以期待与算法相关的问题,如这7个:

  1. 如何实现冒泡排序算法?(解决方案)
  2. 如何实现迭代快速排序算法?(解决方案)
  3. 如何实现插入排序算法?(解决方案)
  4. 如何实现归并排序算法?(解决方案)
  5. 如何实现桶排序算法?(解决方案)
  6. 如何实现计数排序算法?(解决方案)
  7. 如何实现基数排序算法?(解决方案)

字符串编程面试问题

与数组和链表数据结构一起,字符串是编程工作面试中另一个流行的话题。我从未参加过没有基于字符串的问题的编码面试。
关于字符串的一个好处是,如果你了解数组,你可以轻松解决基于字符串的问题,因为字符串不过是字符数组。
因此,你通过解决基于数组的编码问题学到的所有技术也可以用于解决字符串编程问题。

以下是我从编程工作面试中整理的11个常见字符串编码问题列表:

  1. 如何从字符串中打印重复字符?(解决方案)
  2. 如何检查两个字符串是否是彼此的字谜?(解决方案)
  3. 如何从字符串中打印第一个非重复字符?(解决方案)
  4. 如何使用递归反转给定字符串?(解决方案)
  5. 如何检查字符串是否只包含数字?(解决方案)
  6. 如何在字符串中找到重复字符?(解决方案)
  7. 如何计算给定字符串中的元音和辅音数量?(解决方案)
  8. 如何计算字符串中给定字符的出现次数?(解决方案)
  9. 如何找到字符串的所有排列?(解决方案)
  10. 如何在不使用任何库方法的情况下反转给定句子中的单词?(解决方案)
  11. 如何检查两个字符串是否是彼此的旋转?(解决方案)
  12. 如何检查给定字符串是否是回文?(解决方案)

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

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

除了基于数据结构的问题,大多数编程工作面试也会问一般逻辑问题,我将在本节中描述

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