选择题:
简答题:
编程题:
选择题、简答题、编程题一共 60 分钟
行测:(每部分 10 分钟)
宏
操作系统会不会?不会
计算机网络会不会?会一点,自学的
快速排序、选择排序的基本原理
全局变量、局部变量、静态变量
解决哈希冲突的方法(只回答出 二次哈希法 和 拉链法)
介绍拉链法的原理
OSI 参考模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层(面试时以为是 五层模型,表示层、会话层没答出来)
第一轮面试一共 10 分钟
智力题:7g 砝码和 2g 砝码各一个,天平一个,如何用最少次数将 140g 盐分成 50g 和 90g 各一份?
未答出来,一开始想的是 6 次,经面试官提醒后,认为是 5 次
正确答案:最少需要操作三次,过程包括:
算法题:二叉树的最近公共祖先(力扣 236)
最后问了项目,大概 10 分钟左右(因为之前的算法题花了太多时间)
第二轮面试一共 40 分钟
自我介绍
本科成绩是什么情况?是保研的吗?
为嵌入式软件岗做了哪些相关准备?(只回答了 C++)
计算机网络、操作系统、数据结构与算法学过吗?(学过计算机网络,数据结构与算法也学过、在刷题,操作系统没学过)
数据结构与算法刷了多少题?
TCP 与 UDP 有什么区别?
如何理解 TCP 的可靠传输?
TCP/IP 网络模型是怎样的?每一层对应有哪些协议?
如何用两个队列实现一个栈?
研究生课题的主要内容?目的是什么?是不是自己一个人完成的?成果?(两个课题都有问到)
有哪些兴趣爱好?是否拿出摄影作品去参加过学校的展览?骑行都去过哪些地方?
父母的工作
兄弟姐妹的情况
(回答得都比较简短,所以问题有点多。。)
反问:
最后,面试官建议认真学一下操作系统
第三轮面试一共 18 分钟
一共包含四个模块,全都是选择题
题型:15 道单选题,2 道算法题,2 道问答题
限时 60 分钟
单选题涉及的知识:
算法题:
问答题:
10 道单选题:设计模式、概率论相关知识点
9 道不定项选择题:操作系统、数据库相关知识点
3 道算法题(核心代码模式):
10 道言语理解,每小题有相应限时
10 道图表分析,每小题有相应限时
10 道图形推理,每小题有相应限时
99 道性格测试,每小题有相应限时
全都复用了小米的测评结果
行测,每题都有对应的限时:
性格测评,不限时:
一共30道选择题(20道单选,10道多选),限时60分钟:
自我介绍
学习成绩
英语六级成绩
用的什么编程语言
简述利用 matlab 实现的一个算法
你知道我们是重卡部门对吧?你对汽车有没有什么了解(回答 没有)
建议:
面试一共 6 分钟(邮件里写的 20 分钟)
行测:
性格测评,不限时:
拒掉了面试
行测:数量关系、演绎论证、图形推理、图表分析,一共28道选择题,限时30分钟
性格测评:一共88题(每题需从三个选项中选出最符合、最不符合),限时30分钟
一共80道题,限时80分钟
一共25道不定项选择题,限时60分钟
内容涉及以下方面:
自我介绍
讲解项目(大概聊了20分钟)
KKT 条件
从 branch-and-bound 、Benders 分解、Largrange 松弛、列生成 四个算法中选择一个算法,讲解其原理以及应用场景
使用的编程语言(回答 matlab 和 C++),有没有使用 C++ 实现算法(回答 没有,主要用来刷题)
给两道场景题,要求建立数学模型(口述):都是排产、排程相关的场景
面试官介绍业务(主要是与工厂的排班排程相关的实际问题),并且主要使用 python
反问:
面试一共 50 分钟左右(邮件里写的是 60 分钟)
面试官很友好,并且会及时提供引导。面试体验挺不错,虽然很多都不会 hh
一共两道题,24小时内做完
第一题:
现有一家移动运营商(例如中国移动、中国电信)需要为一座城市建造基站,已知该城市终端用户的所在位置和所需的移动流量,可选的基站建造位置,以及不同类型基站的覆盖范围和最大流量。请帮助基站规划员决策需要布置的基站数量,所选的基站位置以及每小时的基站运行状态(无流量需求时基站可关闭,假设基站可随意开关且没有额外成本),使得该家公司的支出总成本最小,包括基站建造成本以及基站运营成本。
第二题:
某学生必须在 4 个不同系中选修 10 门课程,每个系至少选 1 门。这个学生将每个系选修课程数目与获得知识量按照 100 分衡量如表格所示。要争取获得的知识量达到最大。
备注:优先使用 python
两个面试官,副总裁和业务总监
首先进行自我介绍,讲一讲对杉数的认识,自己的优势
自己对这一岗位的工作规划,可能遇到的问题以及解决方案
介绍项目
反问(为什么可以在应用内点法和单纯形法的线性规划上取得优越的性能)
(没有认真准备对公司、岗位的理解和认识,没有提前做好工作规划)
言语理解、性格测评、情景题
120 分钟
选择题:单选、多选共 34 道题,一共 70 分:主要考察运筹优化算法、概率论相关
编程题:两道,ACM 模式,每题 15 分
幸运数:如果一个数在十进制表示下数字5出现了不少于5次,则这个数是一个幸运数。求:大于 N 的最小的幸运数
猜排列游戏:小明有一个由 1 到 n 的整数组成的排列,让你来猜出这个排列是什么。每次可以猜测某个位置的数字,小明会告知你的猜想是“大了”、“小了”或者“正确”。求:在最坏情况下,需要猜测几次,才能在排列的所有位置都得到小明的“正确”的回复。
行测:
性格测评,不限时:
性格测评的这两个板块直接复用了之前做过中兴的测评
16 道单选题,每题 2 分,主要涉及以下方面的知识点:
17 道多选题,每题 2 分,涉及以下内容:
2 道编程题,每题 17 分,均为 ACM 模式:
#include
#include
#include
#include
using namespace std;
int MAX = 1 << 30;
int ans = MAX;
void DFS(vector<int> &nums, int left, int right, int target, int depth) { // 暴力搜索
if (left > right) return;
if (target == 0) {
ans = min(ans, depth);
return;
}
DFS(nums, left + 1, right, target - nums[left], depth + 1);
DFS(nums, left, right - 1, target - nums[right], depth + 1);
}
int main() {
// 读取数据
vector<int> nums;
string s = "";
getline(cin, s);
int n = 0;
cin >> n;
int x = 0;
cin >> x;
s = s.substr(1, s.size() - 2); // 去掉首尾的括号
stringstream ss(s);
string tmp = "";
while (getline(ss, tmp, ',')) nums.push_back(stoi(tmp));
DFS(nums, 0, n - 1, x, 0);
if (ans == MAX) cout << -1 << endl;
else cout << ans << endl;
// system("pause");
return 0;
}
四道编程题,每题20分:
三道多项选择题:
一共限时 120 分钟
面试官首先自我介绍,并介绍事业部(优选)的主要工作,介绍面试流程
自我介绍
有没有实习?
聊项目
对遗传算法、禁忌搜索等算法有没有了解?
介绍一下遗传算法
如果用遗传算法来求解 TSP 问题要怎么求解?
对禁忌搜索这些算法有没有什么了解?
对机器学习是否有了解?(了解朴素贝叶斯、感知器和 BP 神经网络)
有没有做相应的机器学习算法实践?
主要用的是什么编程语言?做题用什么语言?
手撕代码,核心代码模式(在牛客上进行的面试,面试官可以直接在系统上出题)
反问:
面试一共 45 分钟,其中,25 分钟项目、10 分钟代码、5 分钟反问
120 分钟
四道编程题,ACM 模式,分值分别为 20,25,25,30
一共三题,分值分别为 100、200、300,限时 120 分钟
猪场防疫:猪场现有 N 只猪,编号从 0 到 N - 1 (每只猪无论生死都有唯一的编号)。老李在每只猪生产的时候记录了生产的母猪和出生的小猪,格式为 x y1 y2 y3 … ,其中,x 为母猪,y1、y2、y3… 为新生的小猪,以上编码均在 0 ~ N - 1 范围内,每只猪可以多次生产,每只小猪都只有一个猪妈妈。现需要检查任意两只猪是否有亲戚关系(两只猪具有相同的祖先),并计算出关系亲疏情况(关系距离,若相同编号则距离为 0)
输入:
输出:
输入样例 1 :
3
1
0 1 2
0 1
输出样例 1:
1
输入样例 2:
5
2
0 1 2
1 3 4
2 4
输出样例 2:
3
速战速决:在一个 M 行 N 列的街区中,有一个士兵 S 和一个敌人 E ,标识 X 为无法通过的街区,标识 B 为可以通过的街区;士兵在一个单位时间内可以从一个街区移动到相邻的街区(每次只能水平或垂直方向移动一个街区);士兵每次改变方向时,需要额外花费一个单位的时间(士兵第一次移动一个街区的时候,不用考虑其初始方向,即,只需要一个单位时间即可到达相邻街区)。计算士兵最少需要多少时间才能到达敌人所在的街区
输入:
输出:
输入样例 1 :
6 6
SBBBBB
BXXXXB
BBXBBB
XBBXXB
BXBBXB
BBXBEB
输出样例 1:
13
输入样例 2:
3 3
SXE
BXB
BBB
输出样例 2:
8
第一题:字符串压缩,例如,将 “aaBcaBcaBcc” 压缩成 “a3(aBc)c”、将 “aAABBAABB” 压缩成 “a2(2(A)2(B))”
第二题:三叉树中的最大路径和
#include
#include
#include
#include
#include
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* mid;
TreeNode* right;
TreeNode (int _val) : val(_val), left(nullptr), mid(nullptr), right(nullptr) {}
// TreeNode () : val(0), left(nullptr), mid(nullptr), right(nullptr) {}
// TreeNode (int _val, TreeNode* _left, TreeNode* _mid, TreeNode* _right) : val(_val), left(_left), mid(_mid), right(_right) {}
};
TreeNode* buildTree(vector<int>& nums) { // 利用层序遍历数组 nums 构建三叉树
TreeNode* root = new TreeNode(nums[0]);
queue<TreeNode*> que;
que.push(root);
int idx = 1;
while (!que.empty() && idx < nums.size()) {
int size = que.size();
for (int i = 0; i < size; ++i) {
TreeNode* node = que.front();
que.pop();
if (idx < nums.size() && nums[idx] != -1) { // left 子节点
node->left = new TreeNode(nums[idx]);
que.push(node->left);
// cout << node->left->val << endl;
}
else node->left = nullptr;
++idx;
if (idx < nums.size() && nums[idx] != -1) { // mid 子节点
node->mid = new TreeNode(nums[idx]);
que.push(node->mid);
// cout << node->mid->val << endl;
}
else node->mid = nullptr;
++idx;
if (idx < nums.size() && nums[idx] != -1) { // right 子节点
node->right = new TreeNode(nums[idx]);
que.push(node->right);
// cout << node->right->val << endl;
}
else node->right = nullptr;
++idx;
}
}
return root;
}
vector<int> order;
void traversal(TreeNode* root) { // 层序遍历三叉树
if (root == nullptr) return;
queue<TreeNode*> que;
que.push(root);
while (!que.empty()) {
int size = que.size();
for (int i = 0; i < size; ++i) {
TreeNode* node = que.front();
que.pop();
order.push_back(node->val);
if (node->left) que.push(node->left);
if (node->mid) que.push(node->mid);
if (node->right) que.push(node->right);
}
}
}
int ans = INT_MIN; // 最大路径和
int gain(TreeNode* root) { // 计算 以 root 为起点、向下延申的最大路径和
if (root == nullptr) return 0;
int left = gain(root->left); // left 子树最大增益
left = max(left, 0);
int mid = gain(root->mid); // mid 子树最大增益
mid = max(mid, 0);
int right = gain(root->right); // right 子树最大增益
right = max(right, 0);
int maxgain = root->val + max({left + mid, left + right, mid + right}); // 找出最大路径和:从 left 经 root 到 mid 、从 left 经 root 到 right 、从 mid 经 root 到 right
ans = max(ans, maxgain); // 更新最大路径和
return root->val + max({left, mid, right}); // 以 root 为起点、向下延申的最大路径和
}
int main() {
// 读取输入
int n = 0;
cin >> n;
vector<int> nums(n, 0);
for (int i = 0; i < n; ++i) cin >> nums[i];
// int n = 19;
// vector nums = {20, 12, 30, 15, -1, -1, -1, -1, -1, -1, 15, 5, 25, -1, -1, -1, 16, -1, 22};
// 构建三叉树
TreeNode* root = buildTree(nums);
// // 遍历三叉树,检查三叉树构建是否正确
// traversal(root);
// for (int i = 0; i < order.size(); ++i) cout << order[i] << " ";
// cout << endl;
// 计算最大路径和
gain(root);
cout << ans << endl;
return 0;
}
第三题:多进制计算器
选择题,主要考察算法与数据结构、机器学习相关知识
三道编程题:
定义一个字符串为 “ 好串” :当且仅当相邻两个字母不相同。对于一个仅由 ‘r’ 、‘e’、‘d’ 三种字符组成的字符串,可以将相邻两个相同的字母同时删除,并在其位置生成任意一个字母(‘r’、‘e’、‘d’ 三种中的一种)。例如,对于字符串 “dedd”,可以选择将 “dd” 变成 “r”,字符串即变为 “der” 。现给定一个字符串,问:至少需要多少次操作才能将该字符串变成 “ 好串 ”
对于一个长度为 n 的数组,现希望将一些数(不少于 2 个数)染红,满足任意两个染红的数之和都是偶数。问:一共有多少种不同的染色方案?答案对 109 + 7 取模。规定:对于两个方案,只要存在某个数的染色情况不同,则认为是两种不同的方案
15 道单选题,一共 45 分,涉及知识点:
5 道不定项选择题,一共 15 分,涉及知识点:
3 道编程题,分值分别为 10 分、15 分、15 分,均为 ACM 模式
给定字符串 s ,问:字符串 s 中含有多少个形如 baidu 的子串(即,子串长度为 5,第一、四个字母是辅音字母,第二、三、五个字母是元音字母,并且,子串没有重复字母)
已知字符串 str 仅包含 ‘0’ 和 ‘1’ ,每一次可反转字符串 s 中的两个连续字符(例如,“01” 反转成 “10” ),问:是否可以在有限次数内将 str 变成所有字符均相同的字符串(即,所有字符均为 ‘1’ ,或者,所有字符均为 ‘0’ )
给定一个 m 行 n 列的方格,其中,每个小方格有 ‘r’ 、‘e’ 、‘d’ 三种字符中的某一个字符。现从左上角出发,每次可以往四个方向(向上、向下、向左、向右)中的某个方向移动一步,但是,不能从字符 ‘r’ 移到字符 ‘e’ 、不能从字符 ‘e’ 移到字符 ‘d’ 、不能从字符 ‘d’ 移到字符 ‘r’ 。问:至少需要移动多少步才能到达右下角。如果无法到达右下角,则输出 -1
笔试一共限时 120 分钟
行测:
性格测评,不限时:
10 道单选,每题2 分,主要考察操作系统、计算机网络的相关知识
5 道不定项选择题,每题 4 分(少选错选不得分),主要考察操作系统、计算机网络的相关知识
3 道编程题,ACM 模式:
Talent5大五职业性格测评:共 138 题,不限时
iLogic言语推理测评:共 15 题,限时 20 分钟(每题有相应限时)
iLogic数字推理测评:共 15 题,限时 20 分钟(每题有相应限时)
iLogic逻辑推理测评:共 10 题,限时 17 分钟(每题有相应限时)
iDriver职业驱动力测评:共 112 题,不限时
Menlth心理状态扫描:共 50 题,不限时
30 道单项选择题,每题 2 分,考察 Linux 系统、Java、计算机网络、MySQL、数据结构 相关知识
3 道编程题,ACM 模式,一共 40 分