SAP-VT 笔面试记录
项目介绍
2022 秋季 SAP Vocational Training 项目,base 上海张江。不同于一般的实习,这个实习项目时间周期较长,23 年秋季即可入职,可以一直实习到 24 年,先内部培训(带薪),再开始正式实习,其间可以在中国的 base 之间 transfer(疫情前是可以去德国总部的),23 年 10 月时有考核(即秋招的时间),通过后即转正,转正率「极高」。这个项目的目标人群其实是在大三上学期快结束时就已经有明确就业意向的人群,笔试面试难度并不高,下面会写到。总的来说,就业意愿十分重要。
时间线
- 2022 年 9 月 26 日官方招聘公众号发布项目信息
- 10 月 25 日投递简历
- 10 月 31 日通知参加笔试
- 11 月 4 日参加笔试
- 11 月 10 日参加电话面试
- 11 月 15 日通知参加群体面试
- 11 月 24 日参加群体面试
- 11 月 25 日收到 Pre-Offer 邮件
- 11 月 28 日参加 Pre-Offer Communication
- 11 月 29 日拒绝 offer(原因最后讲讲吧😢)
笔试
一个类似牛客的平台,20 道选择(有双选),2 道编程。编程题可以切屏用本地 IDE。
90 min。
选择题
-
第二题是高中数学的线性规划题,好吧…
-
以下哪个(IaaS, SaaS 那几个)是提供给程序员使用的 [IaaS](云计算救我一命!)
-
云计算概念的一个题 [完全不知道]
-
路由器收到了超过 MTU 的报文后咋办?[分片](网络层会分片,数据链路层就直接丢掉了)
-
IPv6 中哪个字段用来认证的?[完全不知道]
-
哪个不是 TDD 的好处 [测试用例即文档。因为感觉这个看上去不是很靠谱]
-
哪个不是敏捷开发 [瀑布式](软工II救我一命)
-
防止死锁的方法 [破坏死锁产生的四个必要条件](看一眼就是老八股了,注意「防止」「预防」「避免」等字眼)
-
Python 命名规范,选出唯一一个可行的 [
_1
类似的一个答案,下划线开头是合法的命名] -
CSS 中用来将长宽扩大两倍的?
transform.scale(2, 2)
transform.matrix(2,2)
剩下两个记不得了,貌似是选 scale,那么我就选错了😢
-
JS 中哪个不能用来弹窗?
window.open()
prompt()
confirm()
alert()
我选的 window.open()
-
一道 C++ 的题,大概是这样,但是这段代码在本地跑不出来😢,估计哪里记错了
1
2
3
4
5
6
7
8
9
10
11class Base {
public:
Base() {
;
}
private:
}
int main() {
Base b();
cout << sizeof(b) << endl;
}我选的0😢
编程题
-
第一题签到题,记不了题了。按题意模拟即可。100% 通过
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] info = new int[m];
for (int i = 0; i < m; i++) {
info[i] = sc.nextInt();
}
int cnt = 0;
int time = 0;
while (true) {
ArrayList<Integer> release = new ArrayList<>();
for (int i = 0; i < m; i++) {
if (time % info[i] == 0) {
release.add(i + 1);
}
}
if (release.size() > 0) {
cnt++;
}
if (cnt == n) {
System.out.println(release.size());
for (int j = 0; j < release.size(); j++) {
System.out.print(release.get(j));
if (j != release.size() - 1) {
System.out.print(" ");
}
}
return;
}
time++;
}
} -
有 n 道关卡,每道关卡通过后都可以获取对应关卡的积分,并且连胜次数 cnt 加一;当该关卡没通过,积分不变,连胜次数归为 0。有 m 个数对,每个数对为 (ci, bi),表示当连胜次数为 ci 时,可以额外获得 bi 积分的奖励。求能获得的积分的最大值。
tricky 的点就是你一直赢不是最优的,反而是要输几次,让 cnt 变小,去获得额外的加分
感觉是个动态规划。最开始写的暴力枚举,36% 通过,TLE。后面改成一个「不是很聪明」的 DP,81% 通过,TLE。
(过了很久的更新:记忆化搜索应该更好)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74private static List<Long> res = new ArrayList<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // n rounds
int m = sc.nextInt(); // m pairs
// read the points
int[] points = new int[n];
for (int i = 0; i < n; i++) {
points[i] = sc.nextInt();
}
int[] cnts = new int[m];
for (int i = 0; i < m; i++) {
cnts[i] = sc.nextInt();
}
int[] bonus = new int[m];
for (int i = 0; i < m; i++) {
bonus[i] = sc.nextInt();
}
Map<Integer, Integer> map = new HashMap<>(m);
for (int i = 0; i < m; i++) {
map.put(cnts[i], bonus[i]);
}
long[][] dp = new long[n][2];
dp[0][0] = 0;
dp[0][1] = points[0];
for (int i = 1; i < n; i++) {
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]);
// dp[i][1]?
dp[i][1] = -1;
for (int j = i - 1; j >= 0; j--) {
// win from j to i
long temp = 0;
for (int q = j; q <= i; q++) {
temp += points[q];
if (map.containsKey(q - j + 1)) {
temp += map.get(q - j + 1);
}
}
if (j == 0) {
dp[i][1] = Math.max(dp[i][1], temp);
} else {
temp += dp[j - 1][0];
dp[i][1] = Math.max(dp[i][1], temp);
}
}
}
System.out.println(Math.max(dp[n - 1][0], dp[n - 1][1]));
}
private static void dfs(int index, int[] points, int cnt, Map<Integer, Integer> map, long sum) {
if (index == points.length) {
res.add(sum);
return;
}
long oldSum = sum;
int oldCnt = cnt;
// pass
sum += points[index];
cnt++;
if (map.containsKey(cnt)) {
sum += map.get(cnt);
}
dfs(index + 1, points, cnt, map, sum);
// backstracing
sum = oldSum;
cnt = oldCnt;
// not pass
cnt = 0;
dfs(index + 1, points, cnt, map, sum);
sum = oldSum;
cnt = oldCnt;
}
电面
10 min 左右。
- 排名 保研 | 考研 | 出国?
- 外企 | 互联网 | 国企研究院?
- 家乡,工作意向城市 | 地区
- 项目:做了什么 难点是什么 收获了什么(答得比较 general)
- 常用技术栈
- 英语问题:How do you think the flexibility in daily work?(口语稀烂)
- 反问。由于没听宣讲,于是问了下项目的时间、线上实习的可能性…
群面
90 min
自我介绍
一共十位候选人。有好几个东南的。还有一个中科大的。我们组没有上海本地学校的(但是后面得 Pre-Offer 的好多上海学校的)。听下来搞 C++ 的和 Java 的居多。
无领导小组讨论
8 个人困在一艘正在下沉的游艇上,冬天,水很冷,直升机只能一次救一个人,问救人的顺序安排(8 个人的年龄、性别、职业地位不同)
非抢答题
- TCP 的拥塞控制你的理解
- 数据库隔离级别有哪几种
抢答题
- 操作系统函数调用的过程,为什么参数太长会栈溢出?(我答的:被调函数的堆栈压到主调函数的堆栈上;参数太长导致堆栈溢出。下来后搜了一下,发现还有寄存器现场保存、PC值改变等等细节,都是学过的,但是那个时候没想起来。一开始还以为是问系统调用的过程…)
- Spring事务的七种形式(?)。一无所知,所以连题目都不是记得很清楚…一位同学完整说出来了
- 网络 IO 的四种方式,Netty 为什么很快,Netty 用的哪种方式。一无所知…
- 讲讲你了解的设计模式。这个好多同学都讲了,我讲了 MVC
- 貌似还有一个问题。但是貌似所有人都不会…就忘了
设计题
设计一个税额计算器,有哪几个类,有哪些主要方法和属性。给出了几个需求。
(我只设计了税表类、计算器类。堆了几个软工II学到的点,比如表驱动计算税额,抽出不同税单的接口(但其实没讲税单有不同种类)。计算器类和税表类的关系应该是组合?计算器类持有税表类的实例)
无算法题,没有具体问个人的简历细节
总结
技术上的:
- 仍然是好多东西没学好啊🤣比如操作系统函数调用的过程,其实是大一一开始学的啦
- 简历很水…
面试上的:
- 电面时就有点紧张,问英语问题的时候卡到说不出一句完整的句子
- 群面开始前老是找不到位置结果迟到了,都想摆烂不面了,结果 HR 打电话来问我,最后在图书馆找了个有插座的地方面了
个人选择上的(加一点小牢骚?):
- 其实这个 offer 得的挺「顺利」的?面试笔试表现感觉都一般吧
- 主要还是 base 问题,其次是本院大三下学期的课程强度…
- 也许还是得考研?
- 要是考研失败、春招四大皆空,我会不会后悔没接这个 offer?
- 外企氛围真的好好哇🌹
- 没得 offer 之前很紧张,得了 offer 开始纠结。世间难有两全事…
- 继续迷茫,偶尔努力,经常摆烂…