这家公司直接往我邮箱里发了邀请链接,估计是通过领英招聘平台看到我的联系方式吧,因为之前也注册过类似的平台,于是本着产品经理多多体验新品的想法,亲自前往试炼,没想到自认经验丰富的我,也会在后续笔试遭遇滑铁卢。
在上面填写资料时,发现工作经历这一块会报错无法保存,于是只能直接跳过。
刚来就上笔试,开场就是算法题,还是我没遇到过的:
给定一个由n个整数组成的数组arr,将数组划分为k个连续非重子数组,使得每个元素属于且仅属于一个子数组,并且每个子数组至少包含一个元素。划分数组以使其美丽度最小。
注意 : 子数组是数组的连续子段
示例
考虑n = 4, arr = [1, 2, 3, 4]和k = 2
使用基于1的索引,展示了每种可能的分割的美丽程度
[1和[2, 3, 4]:分数分别为 1 * 1 = 1 和34 = 12。数组的美丽程度为max(1.12) = 12。
[1, 2和[3, 4]:: 分数分别为 2 * 2 = 4 和24 = 8。美丽程度为 max(4, 8) = 8。
[1, 2, 3和[4]::分数分别为 3 * 3 = 9 和14 = 4。美丽程度为max(9, 4) = 9.
所以,数组的最小可能美丽程度为8.
根据此情况实现函数GetMinimumBeauty,该函数将提供两个参数,数组arr和值k,要求返回最小的美丽度。
我题没看懂就开始瞎写,等写完才发现好像和我想象的完全不同,重新理解一遍后才发现是需要动态规划来解决的,可是我之前写过的动态规划都单纯只是要求计算结果,没遇过这种求数组分组形式的,于是总共耗时20分钟硬是没解决。
后续笔试结束后分享题目给了友人,友人很快就给了他的C++版答案,但没有使用动态规划必备的优化方式——预存子结果,于是我根据友人提供的答案进行抄袭改进:
int GetMinimumBeauty(std::vector<int>& arr, int k, int left, int right, std::unordered_map<std::string, int>& beauties)
{
std::stringstream b_key_stream;
b_key_stream << k << "," << left << "," << right;
std::string b_key = b_key_stream.str();
if (beauties.contains(b_key))
{
return beauties.at(b_key);
}
auto result_handle = [&](int beauty) -> int {
beauties.emplace(b_key, beauty);
return beauty;
};
if (left == right)
return result_handle(arr[left]);
if (k == 1) {
int val = 0;
for (int i = left; i <= right; ++i)
val = std::max(val, arr[i]);
return result_handle(val * (right - left + 1));
}
int beauty = INT_MAX;
for (int i = left; i <= right - k + 1; ++i)
{
beauty = std::min(beauty, std::max(GetMinimumBeauty(arr, 1, left, i, beauties), GetMinimumBeauty(arr, k - 1, i + 1, right, beauties)));
}
return result_handle(beauty);
}
int GetMinimumBeauty(std::vector<int>& arr, int k, int left, int right) {
std::unordered_map<std::string, int> beatuies{};
return GetMinimumBeauty(arr, k, left, right, beatuies);
}
int GetMinimumBeauty(std::vector<int>& arr, int k)
{
return GetMinimumBeauty(arr, k, 0, arr.size() - 1);
}
void TestGetMinimumBeauty()
{
std::vector<int> arr{ 1,2,3,4 };
std::clock_t start_time = clock();
int result = GetMinimumBeauty(arr, 2);
std::clock_t end_time = clock();
std::cout << result << ", time: " << end_time - start_time << std::endl;
}
当然是失败啦,因为没有完成笔试,得分只有不到20分,要求是得80分才能通过。
收到官方的面试失败邮件通知时,我内心是有点想笑的,因为这邮件的措辞就是经典的话术——
虽然你没有通过笔试,但不代表否认你的能力与绩效。
回想网站上连工作经历都有bug无法正常填写时,就感觉我确实没什么好在乎的,单纯对题目本身的懵逼让我无法忘怀,于是才写下这篇文章作为记录。
如果大家也想着试试这种远程工作的话,可以尝试领类等支持远程办公的平台:
领类平台官网