美团2021暑期实习 后台开发一面 面经
编程
题目
漆黑的夜晚,有n
个孩子在河的一侧想要过河。河上只有一座桥,桥同时最多承载两个人。过河的人必须携带手电筒,孩子们只有一个手电筒。 第i
个孩子过河的用时为t_i
,问所有孩子都过河的最少时间。
输入:n
,n个整数t_i
。
输出:所有人过河的最短时间。
等价题目:POJ 3404
解法
动归。
如果只有1/2个人,直接过去;
如果有3个人,让最快的把另外两个分别带过去;
如果有不少于4个人:
- 将所有人的用时排序为
t[n]
。 dp[n]
表示最快的n
个人全部过河的用时,则转移方程为:
dp[n]=max(dp[n-1]+a[0]+a[n-1], dp[n-2]+a[n-1]+2*a[1])
。
本质上,在河对岸已经有人且手电筒在对岸的情况下,把这边最快的两个人送过去有两种方法:分别过去和一起过去。这是max()
只有两个参数的原因。
我根据直觉,很快提出了一个很简单的算法:让最快的孩子把人一个个带过去,然后把手电筒带回来。
面试官提问:如果有两个最快的孩子只需要1分钟,有两个最慢的孩子需要50分钟。按照这个算法,三人过河需要101分钟;但如果让两个最慢的一起过去,再由对岸一个最快的把手电筒带回来,两个最快的一起过去,只需要52分钟。
我陷入疑惑,仍未察觉这是动态规划问题。最后面试官几乎是一点点把答案直接摁到我脸上……
算法
选择排序的时间复杂度,插入排序的平均和最坏情况的时间复杂度,常见的排序算法。
插入排序在什么情况下会比快速排序更好?
操作系统
只问了一个内存管理,我说不上来。我是真的菜。
数据库
数据库A中存储着学生编号和分数,数据库B中存储学生编号和对应班级。要求计算每个班的平均分。
我不会。我是真的菜。
网络
三次握手,四次挥手。
我没学过。我是真的菜。
……答得奇烂无比,居然还告诉我过了,太离谱。后来我听说可能是因为我找了内推,一个面试官无权淘汰我,所以必定有二面机会。不知真假。
——
二面结束一周了,没有后续消息,大概是凉了。二面问的都是简历里项目的细节。