109个编程面试难题解答与技巧

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

109个编程面试难题解答与技巧

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

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

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

为什么编程面试这么难?

编程面试确实越来越难。程序员为了准备而学习更多,竞争越来越激烈。面试官通过问更难的问题来适应。
而且,在压力下编码本身就很有压力。问题通常太短,无法作为有用的筛选工具,反而会让即使优秀的程序员也感到困惑。

但……如果你聪明且有纪律地准备,你仍然可以主导面试!
彻底研究这些问题。
今天我将揭秘你在编程面试中会面对的问题以及如何成功应对。

为了在编程面试中脱颖而出,你需要用真实的编程面试问题来准备。练习真实问题并学习它们的模式。
你会用 informed、切中要点的答案给面试官留下深刻印象,让他们觉得不雇用你是愚蠢的。

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


掌握5种编程面试问题类型

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

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

5个类别:

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

为每个领域的问題做好准备。你会知道要來什么,并能给出聪明的答案。
为这些类型的问题做好充分准备,参加你的编程面试(现场或视频)。
这是你脱颖而出的机会。

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


1. 基础编程面试问题

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

面向新手的编程面试问题

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

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

前13个一般编码、设计和编程基础问题

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

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

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

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

  4. 什么是多态性?
    答案: 多态性允许编程中的新对象承担现有对象的属性。提供继承特征的对象被称为“基类”或“超类”。这是一个程序根据其类型或类不同处理对象的能力。想象一辆车 versus 一辆坦克。多态性会是一个为它们共有系统提供蓝图并跨两种车辆类型工作的系统。

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

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

    • 寄存器:这些是保存在中央处理器寄存器中的存储类。
    • 静态:这是一种变量不改变的存储类。它在编程任务的开始阶段声明。
    • 外部:一种对硬件局部化的存储类,例如设备驱动程序。这些对编译器说:“如果我需要这个变量 again,从外部设备读取它以获取最新值。”
    • 自动:一种块或函数定义局部变量的存储类。
  7. 什么是封装?
    答案: 这是面向对象设计中最重要的概念之一。它涉及将一个类与一组指令捆绑在一起。在封装中,一个对象不仅包括其数据,还包括可以改变该数据的函数。封装可用于隐藏数据的性质,同时仍促进交互。

  8. 命名七种数据类型。
    答案:

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

    • 链表
    • 文件
    • 队列
  10. 特定函数或变量的“声明”和“定义”有什么区别?
    答案: 声明涉及标识符的类型和功能,并描述链接器引用它需要什么。定义描述编译器与标识符交互需要做什么。有时声明提供初始值,有时定义提供值。

  11. 解释器和编译器有什么区别?
    答案: 解释器直接执行命令,而编译器将这些命令(程序)从源代码转换为机器代码。编译的程序运行速度比解释语言快,并且可以大规模使用。
    解释语言示例:Basic, Korn Shell, Ruby, Python
    编译语言示例:Java, C++

  12. 面向对象设计的函数有哪些?
    答案:

    • 封装
    • 多态性
    • 继承
    • 抽象
  13. 什么是实时操作系统?
    答案: 实时操作系统(OS)处理数据 as it becomes available,没有缓冲期。
    实时 OS 示例:实时控制工厂机械。不一定即时,但本质上按需。
    非实时 OS 示例:Windows 和 macOS。响应时间不那么重要。


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

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

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

  • 问问题。
  • 创建算法。
  • 先写“伪”代码。
  • 不匆忙地写代码。
  • 测试你的代码——深思熟虑地修复错误。

(这是 Gayle Laakmann 的《Cracking the Coding Interview》中概述的过程)

数据库问题:前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. 如何检查给定字符串是否是回文?(解决方案)

这些问题帮助你提高对字符串作为数据结构的理解。
如果你觉得对二叉树编码的理解不足,无法自己解决这些问题,我

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