文章目录
- 前言
- 一、专业面试
- 1、什么是欧拉回路和哈密顿回路?它们的主要区别是什么?
- 2、TCP协议如何实现可靠传输?简述其核心机制
- 3、什么是虚拟内存?它是如何通过分页机制实现的?请简述其核心思想
- 4、什么是Batch Normalization?它在深度学习中的作用是什么?
- 5、相比于科班生,你认为你的优势与不足有哪些?
- 6、如果未被录取,你会选择二战吗?
- 二、英文口语
- 1、Describe a time when you had to learn a new technology quickly. How did you approach it?
- 2、What is your greatest weakness, and how are you improving it?
- 三、算法上机
- 1、二叉树的层序遍历
- 2、迭代法求平方根
- 3、给出公式求结果
前言
今天是模拟面试系列第三天,为大家精心准备了 4 道专业课面试题,2 道综合面试题,2 道英语口语题,2 道算法上机题。
涵盖复试中常见的考察点,助你从容应对考官提问!
一、专业面试
1、什么是欧拉回路和哈密顿回路?它们的主要区别是什么?
欧拉回路 :图中经过每条边一次且仅一次的回路。存在欧拉回路的充要条件是:图连通且所有顶点的度数为偶数。
哈密顿回路 :图中经过每个顶点一次且仅一次的回路。目前没有简单的充要条件,判断是否存在哈密顿回路是 NP 难问题。
主要区别 :
- 欧拉回路关注边的遍历
- 哈密顿回路关注顶点的遍历。
- 欧拉回路存在明确的判定条件,而哈密顿回路没有通用解法。
2、TCP协议如何实现可靠传输?简述其核心机制
TCP 通过以下机制实现可靠传输:
- 确认应答(ACK):接收方收到数据后发送确认报文。
- 超时重传:发送方未收到 ACK 时重传数据。
- 滑动窗口:控制发送速率,实现流量控制和拥塞控制。
- 序列号与重排序:确保数据按序到达,乱序时重组。
- 校验和:检测数据在传输中的损坏。
核心机制举例:
- 三次握手:建立连接时同步初始序列号。
- 拥塞控制:通过慢启动、拥塞避免、快速重传等算法动态调整窗口大小。
3、什么是虚拟内存?它是如何通过分页机制实现的?请简述其核心思想
虚拟内存的定义:
- 虚拟内存是一种内存管理技术,通过将物理内存与磁盘空间结合,为每个进程提供一个独立的、远超物理内存容量的逻辑地址空间。
分页机制实现:
- 分页:将物理内存和虚拟内存划分为固定大小的页(如4KB)。
- 页表:每个进程维护一个页表,记录虚拟页到物理页的映射关系。
- 缺页中断:当进程访问的虚拟页未加载到物理内存时,触发缺页中断,操作系统从磁盘加载该页到内存。
核心思想:
- 按需加载:仅在需要时将数据从磁盘加载到内存,提高内存利用率。
- 进程隔离:每个进程拥有独立的虚拟地址空间,避免相互干扰。
- 内存扩展:通过磁盘空间扩展可用内存,支持更大规模的程序运行。
4、什么是Batch Normalization?它在深度学习中的作用是什么?
Batch Normalization(批归一化)是一种在神经网络训练过程中对每层输入进行标准化的技术,通过规范化输入分布来加速训练并提升模型性能。
核心作用:
- 缓解梯度消失 / 爆炸:通过标准化输入(均值为0,方差为1),使梯度传播更稳定。
- 加速收敛:允许使用更高的学习率,缩短训练时间。
- 正则化效果:引入噪声(基于mini-batch统计),减少对参数初始化的敏感性。
5、相比于科班生,你认为你的优势与不足有哪些?
作为跨考生,我的优势主要体现在:
- 复合背景带来的创新视角 :原专业(如数学/物理/经济)培养了我的逻辑思维和问题建模能力,这在算法设计或数据分析中具有独特优势。
- 快速学习能力 :跨考过程中,我通过自学掌握了数据结构、操作系统等核心课程,并完成了多个编程项目(如XXX项目),证明了我能够高效适应新领域。
- 跨学科应用潜力 :例如,我的原专业背景与人工智能结合,可以推动交叉领域创新(如生物信息学、金融风控)。
不足主要在于:
- 基础知识系统性不足 :科班生经过长期系统训练,对底层原理(如编译原理、计算机体系结构)可能理解更深;
- 工程经验较少 :缺乏大型项目开发经验,代码规范性和架构设计能力需要进一步提升。
未来我会通过参与实验室项目、开源社区贡献以及实习,逐步弥补这些不足。
6、如果未被录取,你会选择二战吗?
如果未被录取,我会根据实际情况理性分析。首先,我会认真总结初试和复试中的不足,比如是否在专业课深度、项目经验或面试表达上存在短板。如果认为自己的目标明确且有提升空间(例如需要更系统的知识梳理或更多实践经历),我会选择二战,并制定更科学的复习计划。例如:
- 针对性补强 :通过在线课程或项目实践弥补薄弱环节;
- 调整策略 :优化时间分配,增加模拟面试和真题训练。
如果发现自身兴趣或职业规划与目标专业有较大偏差,我可能会选择先工作或转向其他领域,积累经验后再重新评估。无论哪种选择,我都会保持积极心态,将这次经历视为成长的机会。
二、英文口语
1、Describe a time when you had to learn a new technology quickly. How did you approach it?
描述一下你曾不得不迅速掌握一项新技术的经历。你是如何着手应对的?
During an internship, I was required to learn Python for data analysis within a week. I started by taking an online course to grasp the basics, then practiced by working on small projects and seeking guidance from colleagues. Through consistent effort and hands-on practice, I quickly became proficient and successfully completed the tasks.
在一次实习中,我需要在一周内学会Python用于数据分析。我从在线课程开始学习基础知识,然后通过完成小项目并请教同事来练习。通过持续的努力和实践,我很快掌握了这项技术并顺利完成了任务。
2、What is your greatest weakness, and how are you improving it?
你最大的弱点是什么?又是如何在改进它的呢?
My greatest weakness is that I sometimes focus too much on details, which can slow down my progress. To improve, I’ve been setting clear priorities and time limits for tasks, which helps me stay focused on the bigger picture while ensuring quality.
我最大的缺点是有时过于关注细节,这可能会拖慢进度。为了改进,我一直在为任务设定明确的优先级和时间限制,这帮助我在确保质量的同时更专注于整体目标。
三、算法上机
1、二叉树的层序遍历
代码实现
#include <bits/stdc++.h>
#include <queue>
#include <vector>using namespace std;// 定义二叉树节点结构
struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};// 层序遍历函数
vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> result; // 存储最终结果if (root == nullptr) return result;queue<TreeNode*> q; // 使用队列辅助层序遍历q.push(root); // 根节点入队while (!q.empty()) {int levelSize = q.size(); // 当前层的节点数vector<int> currentLevel; // 存储当前层的节点值// 遍历当前层的所有节点for (int i = 0; i < levelSize; i++) {TreeNode* node = q.front();q.pop();currentLevel.push_back(node->val);// 将当前节点的子节点入队if (node->left != nullptr) {q.push(node->left);}if (node->right != nullptr) {q.push(node->right);}}// 将当前层的结果存入最终结果result.push_back(currentLevel);}return result;
}// 测试代码
int main() {// 构建一个简单的二叉树TreeNode n1(1);TreeNode n2(2);TreeNode n3(3);TreeNode n4(4);TreeNode n5(5);n1.left = &n2;n1.right = &n3;n2.left = &n4;n2.right = &n5;// 层序遍历vector<vector<int>> result = levelOrder(&n1);// 输出结果cout << "Level Order Traversal:" << endl;for (const auto& level : result) {for (int val : level) {cout << val << " ";}cout << endl;}return 0;
}
2、迭代法求平方根
从键盘输入一个大于 0 的实数 a,用迭代法求 a 的平方根。求平方根的迭代公式是:𝑋ₙ₊₁ = (𝑋ₙ + 𝑎/𝑋ₙ)/2
要求前后 2 次求出的 x
的差的绝对值小于一个极小值 0.000001
代码实现
#include <bits/stdc++.h>
#include <math.h>using namespace std;double func(double a, double x) {double x1 = (x + a / x) / 2;if (fabs(x1 - x) < 0.000001) // fabs()求绝对值return x1;return func(a, x1);
}int main() {double a;scanf("%lf", a);double ret = func(a, 1);printf("%lf", ret);return 0;
}
3、给出公式求结果
从键盘输入一个大于 1 的正整数 n,计算以下级数的值,并输出结果(显示结果保留小数点后 6 位)。
代码实现
#include <bits/stdc++.h>
#include <math.h>using namespace std;double func(int n) {double s = 0.0;for (double cnt = 1.0; cnt <= n; cnt++) {s += cnt / ((cnt + 1) * (cnt + 1));}return s;
}int main() {int n;scanf("%d", &n);double ret = func(n);printf("%.6lf", ret);return 0;
}