2015美团校招面试总结

来源:互联网 发布:copyright软件格式 编辑:程序博客网 时间:2024/05/01 17:17
本次面试分为两轮,一轮进行过之后直接进行下一轮,今天就只面了两轮,等通知中,70%会挂,30%不会挂,前事不忘后事之师。

一、(一面)Spring 注解 @Resource 与@Autowired的区别和作用。
在spring中我们通过基于注解(Annotation-based)的配置,进行注入依赖。在java代码中可以使用@Resource或者@Autowired注解方式进行注入。虽然@Resource和@Autowired都可以完成注入依赖,但是它们之间有不同的区别

1.@Resource默认是按照名称进行装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。
2.@Autowired默认是安装类型装配注入的,如果想安装名称来装配注入,则需要结合@Qualifier一起使用。
3.@Resource注解是J2EE提供的,有两个重要的属性:name,type,而@Autowired是由spring提供的,减少系统对spring的依赖建议使用@Resource的方式。
4.@Resource和@Autowired都额可以书写在标注在字段或者setter方法上
二、(一面)spring如何降低耦合的??(这里是一个坑,上面的问题我回答是降低耦合,但是没有回答到点子上,结果自己挖了坑了。。。。)
在spring中降低耦合的关键在于将Bean的依赖关系抽取出来,而不是在于将bean的依赖关系放在哪里的环节(不是配置文件,也不是注解,这些只是实现过程的一个方式)
Spring的IOC,将基于实现类的耦合变成基于接口的耦合,可以避免硬编码造成的过度程序耦合,IOC控制反转就是将某一接口的具体实现类的控制从调用类中移除,转交给第三方(也就是spring容器),这就解决了如何确定该接口的实现类的问题。
Spring的AOP,在业务系统中除了要实现业务功能外,还要实现权限拦截,性能监控,事务管理,日志管理等非业务功能。通常的方式是将非业务的代码穿插在业务代码中,从而导致了业务组件与非业务组件的耦合。
面向切面的编程,就是将这写分散在各个业务逻辑代码中的非业务代码,通过横向切割的方式抽取到一个独立的模块中,从而实现业务组件与非业务组件的解耦。

三、(一面)Hibernate一对多的关系维护问题
一对多关系可以分为单向和双向的,通常是从主控类找到拥有外键的类(表)。可以通过cascade=”all”在一方配置级联操作类型,如果使用了inverse=”true”属性则关系的维护方由一方转到多方。
当cascade为all的时候:所有情况下均进行级联操作。
当cascade为orpnan:当被关联对象失去宿主的时候,将其级联删除。

四、(二面)持久层(Hibernate,Mybatis)框架中的N+1问题
这里我回答的不是很好,因为平时也没注意怎么进行sql优化,就不太了解N+1的问题。导致本知识点没有答的很好,总结一下。
这里指的是一方与多方(一对一)进行查询的时候不能一次性查询出两张级联表(一方表与多方表)的数据,级联查询的时候会出现发出两条语句的情况,如果要查询n条一方数据的话那么会级联查询多方表中的数据,这样就出现了N+1的问题。
在这种情况下只需要访问一方数据而不用访问多方数据的时候加载查询多方是比较浪费资源的。
Hibernate提供了两种检索策略延迟检索策略和迫切左外连接的检索策略。
1.延迟检索策略能避免多余加载应用程序不需要访问的关联对象,Hibernate3已经默认是lazy=true了,lazy=true时不会立刻查询关联对象,只有当需要关联对象(访问其属性的时候)才会发出查询请求。
2.迫切左外连接检索策略则充分利用了SQL的外连接查询功能,能够减少select语句的数目。
可以在映射文件中定义连接抓取方式。



或者使用HQL的LEFT OUTER JOIN.
或者在条件查询中使用setFetchMode(FetchMode.JOIN)
One one= (One )session.createCriteria(One.class)
.setFetchMode(“Many”.JOIN)
.add(Restrictions.idEq(one_id));

3.BatchSize:在One对象设置Size后,取出Many里的数据后,再发N/Size条语句取关联对象的数据,从而达到少发语句的目的。
4.一对一也一样,就不再啰嗦了

五(一面)、6L与5L水倒出3L升水。这是个经典的问题,当时智商不够用了,脑子一片空白,没有任何思路,心里想最多能倒两升水,结果就汗颜了。。。。
这里给出两种与面试官交流的解决方式,这三个杯子首先都是没有刻度的,只知道最多盛这么多水。
1.如果允许在杯子上画刻度的话(意思是在测量的过程中画,而不是提前画),
1.首先6L水倒满,然后倒到5L的杯子中,
2.此时6升水的杯子里只有一升水,然后刻上刻度,
3.将5L的杯子里的水倒掉,将6L杯子里的水倒入5L杯子里
4.将6L杯子里倒满水并倒入5L杯子里,此时6L杯子里剩两升水了,再画上刻度,此时已经能量出两升水了。
5.再将5L杯子里的水倒掉,将6L杯子里的水倒入5L杯子中,此时5L杯子中有两2L水
6.将6L杯子里的水再倒满,并倒入5L中。此时6L杯子里就是3L水,5L杯子里就是5升水了。
2.如果不用画刻度的话,则上面的流程基本不变,在演示的过程中已经发现不用刻度也能量出3L水了,结果没答上来。
说明,这里事先并没有查阅任何相关的资料来解读本题,事后也没有百度解决答案,我是在回来的路上想到的。。。。

六(二面)、N条线分割平面问题
本题与上面是一样的节奏,同样没有答出来,但是我推出了1….6条线能分割的平面,
N 1 2 3 4 5 6 ……
Sum 2 4 7 11 16 21 ……
这里可以根据1,2,3,,,,,n的和进行推导,结果公式为:
1,2,3,,,,,n的和为sum = n(n+1)/2;
而Sum 2 4 7 11 16 21刚好为上面公式的和+1,
所以推导出:sum = n(n+1)/2+1;
当然下面的也是对的:
Sum =( n*(n+1)+2)/2;
这里同样没有在现场给出答案,思考了三分钟后没有结果,就投降了。。。

七、(一面)网络OSI参考模型 TCP协议 三次握手 IP协议的作用 接收报文与发送报文和网络拥塞,,,后面好像不知道挖了多少坑了。。。。。
70%答出来了,但是在网络层和IP这块有点忘了
面试前没有怎么复习。。。。。

八、(一面,二面)操作系统的内存分配,虚拟内存地址的计算

九、(一面,二面)这是打到要害部分了,Linux基本还处于小白的阶段。只是会一点shell
Linux下文件的查找:
1.Find <指定目录> <指定条件> <指定动作>
2.locate 是find -name的另一种写法,比后者快
3.whereis 只能用于程序名的搜索
4.grep ….
只答了一部分。。。

 Chmod 的作用:修改文件的访问权限,利用chmod可以控制档案如何被他人调用, 只能文件拥有者或者特权用户才能使用该功能来改变文件的存取模式。 Chmod  777: 将一个文件的访问权限改为任何人都可以对该文件有读,写,运行权限 Chmod  755: 设置用户的权限为  1.文件的所有者可读,可写,可执行   ---7  2.与文件所有者同属一个用户组的其他用户可读可执行  --5  3.其他用户组可读可执行     --5 Linux下文件的访问权限有哪些:读,写,运行(没答上来)  读,写,运行三项权限可以使用数字表示,就是r=4,w=2,x=1 如何打开一个文件:我回答的是使用vim,gredit ...,或者sudo gredit...对方好像满意了。。。

十、(一面,二面)实现互斥和共享的方式,从操作系统层面和进程层面,线程层面回答。

十一、(一面)如何查找单链表中的倒数第5个节点,我这里是简要说明思路,获得了面试官的认可,如果要写代码的话,千万不能忘了边界问题,如果链表节点数少于5个,或者链表为空的情况下怎么处理,还好没有挖坑。。。。
十二、(一面)二叉排序树查找
这里当场写代码,使用递归,字写的太丑了,,,,,,,还好对方能看懂
十三、(二面)查了我的oschina git的车辆管理系统。。。。。。。有坑自查。。。。。。
十四、(二面)你遇到的最大的困难是什么,你对培训机构出身有什么看法
调试bug的经历,遇到错误如何解决,百度还是看文档,这里我选的是百度,博客什么的,可能还是看文档稍微好点。。。。。

十五、(一面)项目
1.你最有成就感和挑战的项目是什么,或者你最满意的–《bug收录系统》
目前也只有这个最满意了,结果功能还没怎么全面,数据量不够,结果坑挖了不少
2.说明项目实现的内容
3.solr与lucene的区别
4.solr的索引结构
5.solr是如何存储数据的
6.solr与传统数据库有什么差别,优势是什么。。。。
7.如何进行solr查询。。。。
十六、(一面,二面)数据库方面
1.一个student(年级)表,里面两个字段:姓名和班级,如何查询班级人数大于40的人的班级,这里我写的sql太烂了。。。应该没写出来,当时脑子都乱乱的了,很久没碰sql了。。。。
2.你对数据库索引是怎么用的,怎么看的,这个直接说实话了,数据量没超过1000没有使用索引,即使我知道一点索引的优缺点。。。。好吧,坑,我来了。。。
十七、(二面)Top K问题
写代码的节奏。。。。。还好,面试官写了一个方法声明,c++方式的,我说我擅长java,这指针不是很了解,他说行,用自己熟悉的语言。。。字写的依旧不是很好,还好对方能看得懂。。。。。
使用双重for循环,结果代码有问题,还好我后来知道了,并添加了一个函数,但是最终的复杂度我觉得是o(n*k*k),但是面试官提示我有更好的方式,我想说是使用堆排序,但是他让我进行优化,在k个最大数字的数组中找到最小值,并覆盖,这里的时间复杂度是o(n*k),但是面试官说还有更好的方式,我就直接说堆排序,然后让写堆排序,结果,,,,,你懂得。。。
后来对方说,他这个N个数字很大,内存中装不下,我就说将这个大文件分割成n/10个小文件,在内存中维护一个最小堆,更新堆中的数据。。。他好像满意了。。。

这次差点又挖了一个坑,问对方是top k问题吗???。。。

十八、你还有什么要问我的吗?
总共面试80分钟,一面没敢问就直接出去等了一会儿,二面结束就问了一个问题:美团工作是在北京吗???对方回答是的,我就没再问了,估计70%要挂,这里总结一下吧,毕竟是第一次比较正式的面试,前面的两次面试都问的不多,可能与对方的面试结束后的沟通没有做好,另外一方面没有充分做好了解对方公司的准备,导致面试草草结束。

这里与众网友一起共勉,希望找到理想的工作,不辜负大学几年,读研读博的青春。。。。。

0 0
原创粉丝点击