最近参加了联想AI研究院的面试(岗位自然语言处理),除了问到简历中项目以及简单的机器学习问题外,还问了3道算法题,并且都不是拿到马上就能反应出来解法的题目(也可能是本人经验尚缺)。特记录面试过程和题目分析如下,由于没有标答,我想到的解法仅是抛砖引玉,欢迎大家一起探讨。
短暂的简历讨论后,面试官抛出题目1:
题目1:一个矩形边长为x、y,都是正整数(但其大小关系未知),将其分割成若干小正方形,每个小正方形边长可互不相等但需要都为正整数。如何划分使得这些小正方形的边长之和最小?
面试思路:首先想到既然是考算法题,那么不外乎分治法、动态规划、贪心、回溯等等几种。如果要把一个矩形切分成正方形,并且恰好全部切分干净,那么最差的一种方法是全部分解成边长为1的小正方形,这样由于共有xy个正方形,则边长和为xy。
再考虑是否有更好的解法。考虑一个2x2的正方形,若作为一个整体,则边长为2;若分解成4个1x1的小正方形,边长和变成4。这提示我们分割时尽量分出更大的正方形。
由此想到贪心法:分解方法为:程序每次分出当前能分割的边长最大的正方形,若已全部分完,则程序结束;若还有剩余的部分,则对剩余部分再继续按这个方法分解。向面试官描述该思路后,面试官肯定了该思路并又提出如下两个问题:
题目1.1:求出边长之和的最小值
题目1.2:证明贪心策略的正确性
对于这两个子问题,面试官大概分别给出5分钟的时间,面试现场都没有做出来,回来后经过思考总结如下:
1) 由于面试时考虑复杂了,一直在研究x和y之间数量关系。回来后发现对于1.1这类题目要在短时间内做出来最好的方