转自师姐的博客:http://blog.csdn.net/anjing900812/article/details/51558969
时间过得真快,就要准备面试了,上次面试还是保研的时候,虽然保研面试的时候面试了北大,中科院,浙大,浙大跪了,北大弃了,最后来了中科院,不后悔,师兄师姐老师很nice,实验环境很好,项目很多,补贴也很多哦。信工所MESA欢迎大家。
面试总结一:
一面:
- 单向链表中倒数第k个节点;
- Static函数的特点(可以在不创建对象的情况下直接调用,比如单例模式中获得唯一对象就是通过静态方法,还比如main函数)
- HashMap的原理,我主要回答了put操作的原理,且他不是线程安全的。那么,如果多个线程对其同时读写会出现什么异常情况:key链表的循环访问。扩容之后rehash。
- 访问一个网站的过程:域名解析,TCP连接,HTTP请求,前端浏览器解析网页,如果有动态表单,怎么与数据库、服务器交互?
- kafka高并发,快如何实现:消息持久化至磁盘,顺序读写,零拷贝技术;
- 永久代的作用:好吧,永久代就是方法区,当时没有反应过来,说了垃圾分代回收中老年代的作用;
- 一个正在运行的java进程,如何查看其日志文件在哪里,或者配置信息:我用ps -aux | grep找到了这个进程,可以看到一部分信息,之后请教面试官,应该是jinfo命令,好吧。一个博客链接,学习:JVM问题诊断常用命令:jinfo,jmap,jstack
二面:
一面:
- HashMap的工作原理,垃圾回收算法有哪些;
- 打印n行n列的蛇形数组:写完之后设计测试用例,注意分析总结,比如奇数和偶数时,最后一圈的不同;
- 有序数组中,打印所有组合,他们的和为指定值:两个指针,分别向前向后移动。
- 特殊情况:数组中存在大量重复的数据,例如[1,1,1,1,8,8,8,8,8,8],target=9,要求输出所有的组合,怎么处理?
- 判断两个值之和等于target之后,加一下内层循环,并记录此时的j,在内层的while循环中找到所有满足条件的组合,循环结束后,i++,j变为之前的值,以进行和新i的配对;
- 整数数组中,元素递增,找到缺失的那个值;
- 求和,期望和和实际和的差值;
- 数组有序,所以每一个元素依次和之后相邻的元素进行比较,是否差值为1,时间复杂度O(N);
- 更优的方法:对比每个元素值和下标的关系,其差值,可以发现缺失之前的元素差值为nums[0],缺失只有的为nums[0]+1;所以可以用二分查找,找到第一个差值为nums[0]+1的位置,就知道缺失的元素位置及其值;
- 更优的方法:借鉴数组中只有一个数字出现一次的的思想:将该数组与完整的无缺失元素的数组合并,那么只有缺失的元素只存在一次,用抑或进行运算即可;面试官好牛!
- 如果,数组是无需的,元素依然递增,寻找缺失的值:
- 将元素交换至其本应在的位置,指针可以向后移动的条件是,当前位置已经放置了正确的元素,或者是最大值;
- 那么最大值没有相应的位置,所以遍历整个数组后,最大值所在的位置,就是缺失的元素;
虽然由于实习时间问题没有拿到offer,但是收获很大。