蚂蚁金服 暑期实习生 3面 和 阿里笔试 3.25
昨天电话约了今天的电话面试,11:30,聊了40分钟。
昨天下午做了阿里的线上笔试,晚上做了测评。
笔试
笔试难度不大,在牛客网上完成,2道算法题,LeetCode medium难度。
给3xn的矩阵,每列选择其中的一个数, 形成最后的数组。
使得最后的
最小。
输出最小的这个值。
DP求解即可。
时间复杂度: O(3N),
空间复杂度: O(3).
```cpp
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
using ll = long long;
int main() {
int n;
cin >> n;
vector<ll> last_dp(3, 0);
vector<vector<ll>> matrix(3, vector<ll> (n));
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < n; ++j) {
cin >> matrix[i][j];
}
}
for (int i = 1; i < n; ++i) {
vector<ll> dp(3);
for (int dp_index = 0; dp_index < 3; ++dp_index) {
dp[dp_index] = abs(matrix[dp_index][i] - matrix[0][i-1]) + last_dp[0];
for (int j = 1; j < 3; ++j) {
ll new_value = abs(matrix[dp_index][i] - matrix[j][i-1]) + last_dp[j];
if (new_value < dp[dp_index]) {
dp[dp_index] = new_value;
}
}
}
last_dp = move(dp);
}
cout << min({last_dp[0], last_dp[1], last_dp[2]}) << endl;
return 0;
}
一个n x m的矩阵,每列每行都是等差数列,公差为整数。
输入n x m个数,如果为0表示不知道,否则知道。
q个查询,特定位置(下标1开始)的值是否可确定。
递归求解,进行推测即可。可以用一些数组维护:每行/列是否已经被推断、每行/列已知道的数的下标、行列信息。
时间复杂度: O(N * M),
空间复杂度: O(N * M).
#include <vector>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
using ll = long long;
const int INF = 0x3f3f3f3f;
int main() {
int n, m, q;
cin >> n >> m >> q;
vector<vector<int>> A(n, vector<int> (m, INF));
vector<int> row(n, -1);
vector<bool> row_ok(n, false);
vector<int> col(m, -1);
vector<bool> col_ok(m, false);
function<void(int, int, int)> fill = [&](int i, int j, int value) -> void {
A[i][j] = value;
if (col_ok[j] && row_ok[i]) {
return;
} else {
if (!col_ok[j]) {
if (col[j] == -1 || col[j] == i) {
col[j] = i;
} else {
col_ok[j] = true;
int diff = (A[i][j] - A[col[j]][j]) / (i - col[j]);
for (int r = i - 1; r >= 0; --r) {
fill(r, j, A[r + 1][j] - diff);
}
for (int r = i + 1; r < n; ++r) {
fill(r, j, A[r - 1][j] + diff);
}
}
}
if (!row_ok[i]) {
if (row[i] == -1 || row[i] == j) {
row[i] = j;
} else {
row_ok[i] = true;
int diff = (A[i][j] - A[i][row[i]]) / (j - row[i]);
for (int c = j - 1; c >= 0; --c) {
fill(i, c, A[i][c + 1] - diff);
}
for (int c = j + 1; c < m; ++c) {
fill(i, c, A[i][c - 1] + diff);
}
}
}
}
};
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
int v;
cin >> v;
if (v != 0) {
fill(i, j, v);
}
}
}
for (int i = 0; i < q; ++i) {
int r, c;
cin >> r >> c;
--r;
--c;
if (A[r][c] == INF) {
cout << "Unknown" << endl;
} else {
cout << A[r][c] << endl;
}
}
return 0;
}
测评
笔试没难倒我,测试却花了我不少时间。
主要是测试
- 语文:阅读理解、成语使用、归纳和排除 10min
- 数学:表格、图、经济用语 10min
- 智商:看图找规律 10min
- 性格:是否抗压、反社会 30min
全靠高中学习到的知识和技能。智商就天生的呗。
据说和公务员的考试很像,行测。有了解的朋友可以看看。
应该也不会用测评去筛人,又不是考公务员,手撕代码才是王道。
面试
面试官很NICE,还加了我微信进行沟通。
主要聊了项目,还有一些数据处理的知识和Java的了解。
- 数据预处理,对缺失值的处理
- 给一个信用评估的数据,如何利用和上线
- Java了解程度和使用,Spring boot
最后问了英语怎样,口语如何。可能是因为对方是 国际化事业群 吧。
我最后问了面试官所在的组和业务。
面向海外的个人信贷业务,类似花呗和借呗。
查看9道真题和解析