Title | Content |
---|---|
时间 | 2017-07-31 10:00 |
地点 | 北京市朝阳区东四环中路56号楼远洋国际中心26层 |
部门 | 海外购 |
岗位 | 全栈开发 |
性质 | 暑期实习,可转正 |
前言
本来是通过师兄走秋招内推,该部门多出两个暑期intern,所以帮忙推了下。
面试当天,照常跑步,到8:20左右从宿舍出发,特别怕迟到,一路上很赶,最后提前30分钟到达。
后来被HR带到10层去面试。
第一轮
Title | Content |
---|---|
时间 | 10:00-11:00 |
面试官 | 男性 |
Q1
问题 | 实现LRU,即实现缓存 |
---|
面试官先讲了缓存的概念
缓存处理主要是新的替换旧的
我设计了类的数据定义和接口
面试官让我只实现添加和返回缓存实例的接口
添加是给定key-value
返回实例是给key
我的做法是通过HashMap缓存数据,再维护一个List维护数据的进入时
间。大体没问题,一些细节、异常处理疏忽了,他说其实这些地方才是经常
考核的。
Q2
问题 | 讲一个你的项目 |
---|
讲了自己的一个偏向后台框架设计的项目,讲到一些框架的时候,会问为什
么用它不用别的,分析下就好。
这一部门基本上是我自己讲,面试官的反馈挺少的
第二轮
Title | Content |
---|---|
时间 | 11:00-12:00 |
面试官 | 男性 |
Q1
问题 | 将二叉搜索树变成双向链表,不需要额外空间,改变指针就好 |
---|
这题我的思路从inorder遍历出发,在面试官的提示下写了递归法,原理
没想清楚,但是似乎是对的,但是处理出来的是单链表,之后需要遍历一遍
改成双向就好
思路:
(1)定义函数helper,含义是返回包含node的双向链表
(2)每次递归,求得node的左右两边子树得到的双向链表,并返回左右子树的双向链表的尾部节点
(3)分左右子树为空、不空各种情况下,将左边、parent、右边组合成新的双向链表的策略进行组合
class Node{
public int val;
public int left=null;
public int right=null;
public Node(int val){
this.val = val;
}
}
public class Sollution{
void sove(Node root){
}
Node helper(Node node){
if(node==null)
return null;
Node leftEnd = helper(node.left);
Node rightEnd = helper(node.right);
if(leftEnd==null && rightEnd==null){
node.right=node;
return node;
}
if(leftEnd==null && rightEnd!=null){
Node rightStart = rightEnd.right;
node.right=rightStart;
right.left=node;
rightEnd.right=node;
return rightEnd;
}
if(leftEnd!=null && rightEnd==null){
Node leftStart = leftEnd.right;
leftEnd.right = node;
node.left=leftEnd;
node.right=leftStart;
return node;
}
if(leftEnd!=null && rightEnd!=null){
Node leftStart = leftEnd.right;
Node rightStart = rightEnd.right;
node.left=leftEnd;
node.right=rightStart;
leftEnd.right=node;
rightStart.left=node;
rightEnd.right=leftStart;
return rightEnd;
}
}
}
Q2
问题 | 将阿拉伯数字转换成中文读法,例如“12”,转换成“十二” |
---|
我只考虑了不含0的,亿以下的转换。经过面试官提点才发现这个问题。这
就是我失败的地方。
面试反馈
Failed
总结
其实面试官出的题都挺简单的,但是就是在那种封闭、时间限制的环境中,很多细节觉得没必要(其实往往是考核的,也是你比别人更优秀的地方,简单的大家都会做,做好细节才能突出自己)。同时思维比较局限,有遗漏case的情况,这是致命的。
下此面试一定要注意细节!!!