一面
首先是自我介绍,简单问了一些项目相关的问题。
后面问了一些Java语言相关的问题,但是因为我很久没有用过Java了所以就大概说了下Java大概的一些语法类的东西。
后面问了一些数据结构的知识,解释数组、queue和链表,并解释数组 queue 链表分别如何实现和优缺点,并选取了一个具体的应用场景,让选择使用数组还是链表。那个实例我不记得了,但是是需要通过下标快速访问的,所以显然是用数组。下面放上一个相关资料
后面问了mysql的相关问题,知道哪些mysql语句,并实现一个查询某个酒店t1-t2时间内入住的客人数问题,首先设计Hotel、Room、Guest以及需要的多对多关系几张表,然后写它们都需要哪些字段,并写出查询语句。
之后问了几个网络相关的问题,比如网络几层结构以及tcp协议。网络有几层我当时忘记了,后来查了一下是7层,OSI模型。然后TCP协议是什么,我只答到了三次握手。。不过貌似主体就是这个吧~TCP协议。
后面就是一个算法题了,给定一个长度为N(1<=N<=10000)的小写字母串,找到第一个只出现一次的字母,并输出字母和位置。这个题很简单扫一次记录每个字母出现的位置和次数然后扫一遍26个字母就可以了。
最后是一道智力题,一个圆形蛋糕里面有一个矩形洞,如何一刀把这个蛋糕平分。很简单,但是当时没想到。。连接圆心和矩形的中心就可以了。。推广到多边形的洞也一样,连接圆心和多边形重心即可。
二面
自我介绍时实验室工作相关问了很多问题,比如实际系统如何评估,实际系统和算法结果不一致时如何改进model,最终总结有两点,一是调高实际数据在训练数据中的比重,二是利用实际数据修正训练结果。
后面是一道算法题,螺旋打印一个n*n的正方形(比如螺旋打印一个3*3的正方形结果如下面所示) 面试官提示的很清楚,先把问题拆分,看如何打印一圈size为n的数字,然后之后打印size为n-2的数字即可,然后每圈确定起始数字和size之后便可以确定的打印出这圈了,一次长度为size-1的循环打印出一圈每个位置对应的数字即可。对于每圈,假设size是s,起始数字是start, 起始位置坐标是i, j,当前偏移是bias的话。整体代码变如下所示
1 2 3
8 9 4
7 6 5
螺旋打印三面
首先是python基础基础知识 ,迭代器和生成器(yield)迭代器和生成器。
如何实现xrange,这个在理解了迭代器和生成器基础上就可以很好地实现了。
利用python lambda函数实现把一个数组偶数乘以二奇数乘以三输出,当时忘了具体语法了。。语法有错误,也忘记了map,最简便的写法应该是,其中a是输入的数组
print map(lambda x: 3*x if x%2 else 2*x, a)
最后是一道算法题,有一个长度为L的数组,给出它们的价值分别是v1-L,如何切割绳子使得价值最大。是一个动态规划问题,按照第一刀切在哪里分类。通过记录每个长度的绳子切割所能获得的最大值来计算,时间复杂度是O(n^2),题目不难,在此不再贴代码。之后LeetCode遇到相似的算法题再放链接好了0.0
网友评论