编程面试终极指南:109个技术问题与解答全解析
面试准备的核心要素
编程面试正在变得越来越难。程序员需要更多准备,竞争更加激烈,面试官也会提出更难的问题。在压力下编码本身就充满压力,而问题往往过于简短,反而可能绊倒优秀的程序员。
但通过有纪律的准备,你仍然可以主导面试!你需要掌握以下五个方面的能力:
- 编程知识:基础编程概念
- 编程技能:数据结构(数组、字符串、链表、二叉树等)、概念(位操作、设计模式等)和算法
- 逻辑能力:通过练习逻辑谜题来提升
- 问题解决过程:区分优秀程序员和"仅仅是编码员"的关键
- 个性匹配:与公司文化和目标的契合度
1. 基础编程面试问题
通用编程、设计和编程基础问题
-
你选择的技术有哪些优缺点?
例如,如果你最喜欢的技术是Node.js,需要能够全面回答这个技术问题,展示你在该特定领域的知识深度。
-
什么是变量?
没有变量就没有程序。变量是根据程序整体条件和所做"工作"而改变的值。变量是存储在程序中或"声明"的值,代表程序的工作数据集。变量 = 数据集 + 算法。
-
什么是继承?
继承是面向对象编程(OOP)语言的核心概念之一。这是一种机制,可以从另一个类派生一个类,形成共享一组属性和方法的类层次结构。
-
什么是多态性?
多态性允许编程中的新对象承担现有对象的属性。提供继承特征的对象称为"基类"或"超类"。
-
什么是指针?
指针包含其他值的内存地址。操作指针比操作指针引用的数据可以节省时间。这可能是编写操作数据程序的有效方式。
-
命名四种存储类
寄存器、静态、外部和自动。
-
什么是封装?
这是面向对象设计中最重要的概念之一。它涉及将类与一组指令捆绑在一起。在封装中,对象不仅包括其数据,还包括可以改变该数据的函数。
-
命名七种数据类型
浮点、整数、字符串、浮点数、实数、字符、布尔值。
-
命名六种数据结构类型
链表、文件、栈、队列、树、图。
-
函数或变量的"声明"和"定义"有什么区别?
声明涉及标识符的类型和功能,描述链接器引用它需要什么。定义描述编译器与其交互需要做什么。
-
解释器和编译器有什么区别?
解释器直接执行命令,而编译器将这些命令(程序)从源代码转换为机器代码。
-
面向对象设计的功能有哪些?
封装、多态性、继承、抽象。
-
什么是实时操作系统?
实时操作系统(OS)在数据可用时立即处理,没有缓冲期。
2. 数据结构和算法面试问题
数据库问题
-
定义"数据库"一词。数据库管理系统提供什么样的交互?
数据库是包含数据并允许使用、访问、更新和处理数据的任何电子系统。
-
数据库管理系统如何改进基于文件系统的功能?
基于文件的系统可能直接由用户交互,但不一定是并发的。数据库管理在文件系统和使用的应用程序编程接口(API)之间提供中介。
-
数据库技术的三种主要类型是什么?
结构/数据、导航、SQL/关系。
-
规范化用于什么?
规范化重组数据以消除冗余并节省磁盘空间。
-
DDL和DML有什么区别?
DDL代表"数据定义语言",指定数据库的结构。DML代表"数据操作语言",指如何从所述数据库中检索或修改数据。
-
为什么需要数据库分区?
分区通过创建独立、更稳定和更可用的单独文件系统来提高效率和数据可用性,并最大限度地减少数据丢失。
-
什么是实体——什么是实体集?
实体是离散对象或数据点,例如人或地点。实体集将相同类型的实体分组。
数组编码面试问题
- 如何检查数组是否只包含数字?
- 如何找到给定数组的所有排列?
- 如何在1到100的给定整数数组中找到缺失的数字?
- 如何在给定整数数组上找到重复数字?
- 如何在未排序的整数数组中找到最大和最小数字?
- 如何找到整数数组中所有和等于给定数字的对?
- 如果数组包含多个重复项,如何找到重复数字?
- 如何在Java中从给定数组中删除重复项?
- 如何使用快速排序算法就地排序整数数组?
- 如何就地删除数组中的重复项?
- 如何在Java中就地反转数组?
- 如何在不使用任何库的情况下从数组中删除重复项?
树相关问题
-
什么是二叉搜索树,它用于什么?
二叉树是一种具有两个"子节点"的数据结构,有助于研究分叉数据。
-
命名五种类型的树
二叉树、二叉搜索树、AVL树、B树、B+树。
-
如何实现二叉搜索树?
-
如何在给定二叉树中执行前序遍历?
-
如何在没有递归的情况下在给定二叉树中进行前序遍历?
-
如何在给定二叉树中执行中序遍历?
-
如何在没有递归的情况下使用中序遍历打印给定二叉树的所有节点?
-
如何实现后序遍历算法?
-
如何在没有递归的情况下后序遍历二叉树?
-
如何打印二叉搜索树的所有叶子?
-
如何计算给定二叉树中的叶子节点数?
-
如何在给定数组中执行二分搜索?
-
如何镜像二叉树?
-
如何计算给定二叉树中的叶子节点数?
-
如何检查树是否平衡?
图相关问题
-
图的深度优先搜索或遍历是什么?
深度优先搜索(DFS)通过从根节点开始并在回溯之前尽可能远地跟随每个分支来搜索图和树。
-
图的广度优先遍历是什么?
广度优先遍历(BFS)首先检查兄弟节点,然后检查子节点。
-
给定特定图,如何确定它是否循环?
列表问题
- 如何一次遍历找到单链表的中间元素?
- 如何检查给定链表是否包含循环?如何找到循环的起始节点?
- 如何反转链表?
- 如何在没有递归的情况下反转单链表?
- 如何从未排序的链表中删除重复节点?
- 如何找到单链表的长度?
- 如何找到单链表中倒数第三个节点?
- 如何使用栈找到两个链表的和?
算法问题
- 如何实现冒泡排序算法?
- 如何实现迭代快速排序算法?
- 如何实现插入排序算法?
- 如何实现归并排序算法?
- 如何实现桶排序算法?
- 如何实现计数排序算法?
- 如何实现基数排序算法?
字符串编码问题
- 如何从字符串中打印重复字符?
- 如何检查两个字符串是否是彼此的字谜?
- 如何从字符串中打印第一个非重复字符?
- 如何使用递归反转给定字符串?
- 如何检查字符串是否只包含数字?
- 如何在字符串中找到重复字符?
- 如何计算给定字符串中的元音和辅音数量?
- 如何计算字符串中给定字符的出现次数?
- 如何找到字符串的所有排列?
- 如何在不使用任何库方法的情况下反转给定句子中的单词?
- 如何检查两个字符串是否是彼此的旋转?
- 如何检查给定字符串是否是回文?
3. 编程面试逻辑问题与解决方案
逻辑和数学问题
- 如何在不使用第三个变量的情况下交换两个数字?
- 如何检查两个矩形是否彼此重叠?
- 如何设计自动售货机?
逻辑数学和概率面试问题
-
检查数字是否为偶数的公式是什么?
num % 2 == 0
-
1到N的和公式是什么?
1 + 2 + … + (N – 1) + N = (N+1) * N/2
-
几何级数求和的数学公式是什么?
2^0 + 2^1 + 2^2 + 2^3 + … 2^n = 2^(n+1) – 1
-
给定两个公平骰子,两个骰子总和为8的概率是多少?
掷两个公平骰子有36种(6*6)结果,两个骰子总和为8的结果有5种,概率为5/36。
-
有100个人站成一个圆圈。站在第1位的人杀死下一个人(即站在第2位的人)并将剑交给下下个人(即站在第3位的人)。最后哪个人存活?
如果总人数不是2的幂,则算术级数中第n位的人总是存活。
-
如何检查质数?
4. 软件工程师或编码员工作的问题解决面试问题
问题解决示例
-
随机选择问题示例
如果你有一个52个数字的数组,比如一副牌,随机选择一个很容易。你的任务是生成一个1到52之间的数字,并将其用作数组的索引。
-
更难的变体
假设你既不能一次看到整个集合,也不能存储它。换句话说,你不会被告知总共有多少个数字,并且一次只显示一个数字。
-
如何解决这个问题
你只需要存储两个数字:到目前为止看到的数字的总计数,以及你当前的候选响应。
其他问题
- 编写算法查找给定单词在文本选择中的每个实例。
- 编写程序生成给定范围内的随机数。
- 如何检查字符串是否只包含数字?
- 给定两个字符字符串,找到将字符串1转换为字符串2所需的最小更改次数。
- 如何计算给定字符串中的元音和辅音数量?
- 给定每个方格都有数值的网格,如何编写解决方案来找到从网格一侧到另一侧的最低值路线?
可扩展性问题
- 查找包含单词列表的所有文档
- 为社交媒体网络设计数据结构
5. 行为编程面试问题——你如何适应他们的文化?
行为与软技能编程面试问题
-
你的弱点是什么?
当被问及你的弱点时,给出一个你实际的弱点!不要把你另一个优点伪装成弱点。
-
你最近面临的技术挑战是什么——你是如何解决的?
他们在这里评判你的过程。准备一个你通过过程解决问题的情境。
-
你经历过哪些失败,你通常如何处理失败?
再次,诚实地讲述你经历过的真实失败。
-
为什么你认为自己适合这份工作?
这是进行电梯演讲的好地方。
-
你从过去的经历中获得的最大知识是什么?
这个问题围绕你简历上的某个特定点。
-
你如何处理与同事的冲突?
面试官在这里寻找的是你能证明自己可以与人良好合作,不会小气——如果发生冲突,你在解决问题方面既坚韧又主动。
-
一般"闲聊"问题
你可能会与面试官闲聊。在这里,重要的是不要透露任何他们会用来立即取消你资格的信息。
他们不会停止询问的"奇怪"常见编程面试问题
-
五年后你看到自己在哪里?
描绘你仍然为他们公司工作,以各种方式发展它的画面。
-
你上一份工作的薪水是多少?
他们在这里试图看看你是否会向别人透露专有信息。
-
你对这份工作想要多少薪水?
如果面试官问你申请的这份工作想要多少薪水,不要直接回答问题。
脑筋急转弯面试问题
-
你有九个球。八个重量相同,一个较重。给你一个天平,只告诉你左边还是右边较重。只需使用两次天平就找到重球。
将球分成三组。称重一次后,你就会知道哪组有重球。
-
有一栋100层的建筑。如果鸡蛋从第N层或以上掉落,它会破裂。如果从任何以下楼层掉落,它不会破裂。给你两个鸡蛋。找到N,同时最小化最坏情况下的掉落次数。
解方程:X + (X-1) + (X-2) + … + 1 = 100,得到X = 14。
下一步行动
这些编码、数据结构、算法、逻辑和行为问题是你需要知道的,才能成功与任何公司——无论大小,任何级别的编程工作——进行面试。
这些问题列表:
- 帮助你开始准备面试
- 给你好的学习主题
- 让你找到自己的优势和弱点
最重要的是,你需要良好的数据结构和算法知识才能在编码面试中成功。所以这应该是你大部分注意力的焦点。但是……也不要忽视那些软技能!