[ 登录注册 ]

面经笔经

Exoweb面试经历

2016-05-13 09:47:40 admin 返回上一页

很荣幸,我也去Exoweb参加和面试,并成功进入复试,不过现在还在等通知,下面我就简单介绍下我这2轮面试的感受:
准备阶段:在收到面试通知之前,大约是面试的前2天,第一天我去找了下他们公司的大概位置,因为我是路盲,没办法,坐车加走路,大约2小时找到,原路返回,第二天我就系统性的看看他们的上机面试题,也在网上我自己的大学老师交流了下,然后一切OK,准备面试。

初试:首先是上机测试,还是那三道题,还在蓝点上学的时候就把那3题给做完了,感觉很简单,就是一些简单的算法,设计数据结构等问题,如果是本专业毕业的,相信问题不大,如果不是,那最好提前准备下算法怎么实现。有点不习惯的可能就是没IDE工具的那种提示了,其实我还是喜欢那样写代码,在没学java之前,我一直都没用过IDE工具,大约1小时,终于搞定了上机测试,然后人事的人就给张表给你填,里面敏感信息大约就是工作经验,户口所在地以及薪水问题等等,然后就是人事面试,他们人事的那个女的带我到他们二楼,感觉他们那工作环境很好,所以一点也没感觉到紧张,第一个问题,就是用英语简单的介绍下自己,去之前我也简单的准备了下,无奈英语底子实在是很差,然后很艰难的介绍完自己,那个人事的女的看了看我的简历:专科,一年工作经验。然后就问了个问题:“你在大学里做的最成功、最有成就感的一件事是什么?”然后在脑海里想了想,把原来在国家等级考试里,如何用自己的思维去做C语言上机测试题说了下,这也真的是我在大学里最有成就感的一件事了,后来在蓝点学习,耿老师也说过那种方法:就是传说中的死去活来法,呵呵。然后,人事来了个很郁闷的问题:你认为北京市一天能卖出多少羊肉串,5分钟内回答出来,而且要确切的数字,当时有点郁闷,关键是时间很短,回答这类型的问题其实也很简单,关键是找到突破口,他考你这个题也就是考你怎么选择的突破口,当时我是这么说的:
一个羊肉串摊一次能摆20个串(事后发现少了,至少也可以30个),然后大约2分钟可以烤好,一小时就可以烤30次,然后大约11点羊肉串摊才基本开始营业,到晚上9点关门,假设烤羊肉串的人不停的烤,一天大约是3小时,然后北京有7个区,每个区大约50个小区,一个小区大约2个羊肉串摊位,得出的结果是;sum=20*30*3*7*50*2=1260000,然后人事问我,你确定吗?大约想了半分钟,我说我确定。呵呵,这个数字可能真的大了点,后来调查了下,一个摊一天大约卖出600串,火一点的1000多,我这个算出来一个摊1800串一天。其实她也不知道一天能卖多少,关键是看你是怎么处理这个问题的,问完这个问题,然后人事又问我,对他们公司有什么问题,当时我不知道他不是技术人员,问了些技术问题,他也不清楚,呵呵,不过我从她口中知道他们公司是做python网络编程的。

复试准备:我就这么结束了自己第一次面试,然后在睡梦中过了个很郁闷的中秋节,放完假第一天就收到复试通知,又是周五,郁闷!其实我感觉自己能进复试是十拿九稳的事,因为刚开始准备的很充分,然后我又看了看章云鹤的面试感受,看样子那个公司喜欢考算法,不过还好,算法算是我大学里的强项,而且我大学里和我关系最好的老师(之前提到的那个老师)就是教我算法和数据结构的,然后我和他又谈了次,然后他也没给我很好的建议,期间都是我自己想出来怎么优化算法的,其实我很庆幸,自己能够边面试边学到一些东西,还是很不错的,然后自己在蓝点的机器里面用Eclipse实现下自己的优化算法,测试下,结果正确!这样,复试的准备工作就做完了。

复试:那天是下午1点半面试,迟到了几分钟,有点紧张,呵呵,前面几个人都是在复试中刷下来的,所以刚开始就有点紧张,然后人事让的等一下,大约3分钟,面试官到了,我的复试和章云鹤的有些不同,上来就是2个面试官,首先还握了下手,呵呵,然后基本上是一个人提问,一个人听,面试时间大约是1个半小时,首先还是些非技术性的问题,问了下我的兴趣爱好,然后扯个大半天吧,然后技术官拿出了我的简历,看了看我的项目经验,然后问我自己认为那些项目做的最成功,当时有些郁闷,那些项目都是乱写的,根本就没怎么看,所以我就避开了话题,我说我感觉那些项目都不怎么好,因为java里面的框架都很成熟了,没什么新的技术,我们做的都是后台,而且大部分都还是数据库,代码复用率很高,所以我感觉不到一点成就感,我喜欢研究一些新鲜的,自己感兴趣的东西,然后好不容易蒙混过去,然后技术官拿出了我的初试代码,说我的代码有问题,当时有一点紧张,因为这打乱了我的复试计划,我以为他们也会问我一些优化算法的问题,当时我看了看代码,里面有好多英文,当时有点郁闷,因为自己英语很差,我很想说句:“对不起,我英语太差了,你能说下这个错误提示吗?”,但当时我还是强忍住了,后来我明白了代码错误问题,原来他把我写打代码做了下测试,测试了14次,OK 8次,Error 4次,Time Out 2次,Error里的提示是 should be -10,ont 0,for input[-10],这时候我看明白了,意思是最大子序列的和是-10,不是0!,当时很兴奋,我说,我明白了,当时他们就让我把代码重新说下,然后我说我以为最大子序列如果小于0的话,那么空序列就大于他,而这里你们求出的最大子序列之和小于0,说明你们认为把空序列里面不能装元素,然后我把代码改了下,把首先假设的最大值改成所有元素的和,当时以为问题解决了,没想到带来了更大的问题,他问我为什么假设最大值是所有元素的和?问我可不可以最大值是-1000,可不可以是0?等等,当时问得你有点措手不及,还好当时反映过来了,顺利解决,然后他们说假设成第一个元素这样就少了那个for循环,降低了时间复杂度,好不容易扯完这个,然后,这个问题还没完,他问我,我刚才把假设的最大值设置成所有元素之和,这样做不但会使时间复杂度上升,还会出现什么问题,想了半天,想出来是和可能会超出int的范围,然后他叫我给他一个解决方案,我说可以改成double或者使用对象,然后问题又来了,你认为这样不会溢出吗?我说可能不会吧?他说我要的不是可能,然后算了半天,假设所有的元素都是int中最大的,也就是(2^31)-1,数组最大长度也是(2^31)-1,那么最大值就大约是2^62,在double的范围之内,然后把返回值改成double就OK了,好不容易解决了这个问题,然后我给他们说了个更简单的算法,也就是用动态规划算法求最大子序列,然后我自己把这个算法给他们说了一遍,他们也没听过这个算法(不知道真的假的),然后我说了说这个算法的来历(呵呵,我都怕了,成他们老师了),这个问题就算真正的解决了,最后一个问题,技术官说:“我们老板是外国人,特别崇尚中国的愚公移山的精神,假设沙哈拉沙漠所有的沙子装在一个立方体(正方体)容器里,那么这个容器的边长是多少,5分钟给除答案,误差在10%左右”,当时我是这么做的v^3=10*70*10^4*10^6;
这个问题和初试的那个问题有点相似,我认为沙哈拉沙漠大约和新疆那么大,然后沙子大约10米,然后得出这个答案。然后他问我为什么是10米,我说是平均,他说还有50的沙丘,1米深的小沙盆地,我认为平均就是25米啊,然后我说100个数字,有99个数字是100,1个数字是1,可不可以说平均值是50?然后他没话说了,呵呵,然后我再侃了点说,我认为编程序还是要结合实际,要准确的算出这些东西,必要的统计学和概率学要一点,然后,技术官看了看表,笑了笑说,今天的面试就到这了,有机会我们去测一下吧,然后在他们下面做了会,然后人事的过来了,叫我5天内等通知(等到现在还没等到,呵呵,估计没戏了)

这2次的面试的点感受:
1. 知己知彼,百战不殆,说的是我的初试,我初试准备的很充分,所以才能够进入复试,当然也是得益于吸取了前2位的经验教训以及和老师的交流。
2. 面试的时候不要紧张,保持清醒的头脑很重要,有时候人家就是考验你这方面的能力,本来你很有能力,被人家忽悠下就不行了,那样也是不行的,技术固然重要,灵活性也很重要
3. 算法、逻辑也很需要,这家公司考你的技术很少,考的基本都是逻辑,这些往往是学习一门编程语言时最容易被忽略的地方,在学蓝点java的时候,除了初级耿老师说了些编程的技巧(也就是些算法),到javaEE的时候,有些东西都是固定死的,很少有什么创新吧,java里算法不是很重要,有的算法都写好了,直接调用就OK了,而这家公司就是考你一个小小的东西是怎么实现的。或许应聘javaEE方面的不需要这些
4. 实事求是,有什么说什么,我刚开始我就和他们说,我觉得我javaEE学的不怎么样,MVC设计模式也没弄明白,但我一直想做一个SSH的项目。
5. 扬长避短,我也没有像章云鹤那样和他们大谈数据库、MVC,而是和他们谈了些算法实现,以及保证程序的100%正常运行等等自己感兴趣,有懂些的东西。这样自己才不会被面试官侃晕,人家之所以是面试官,肯定是有技术的,你谈自己不会的,无疑是“引狼入室”。

我的优化代码:
初试代码就不写了,很简单,写下复试代码以及他的一些思想。
首先写个快速排序的算法,因为1、2都要调用这个方法,在优化的时候可以写在自己优化的那个类里面
public class QuickSort()
{ public static void quickSort(int[] pData,int left,int right)
{
int i,j;
int middle,temp;
i = left;
j = right;
middle = pData[left];
while(true)
{
while((++i) while((--j)>left && pData[j]>middle);
if(i>=j)
break;
temp = pData[i];
pData[i] = pData[j];
pData[j] = temp;
}

pData[left] = pData[j];
pData[j] = middle;

if(left QuickSort(pData,left,j);
if(right>i)
QuickSort(pData,i,right);
}
}
1.这个算法主要是把改问题分解成2个经典算法——排序和查找
先新建一个数组,把原数组里的元素都赋值给新数组,然后新数组排序好,然后可以从0到n/2长度循环,如果第i个元素和第i+n/2个元素相等,则表示有一半元素相等,把该元素做成一个目标值,然后再在原数组中查找该元素的位置。返回下标.
public class Dominator {
static public int dominator (int []a)
{
int n=a.length;
int result=-1;
int target;
int temp;
int []b=new int[n];
for(int i=0;i {
b[i]=a[i];
}
QuickSort. quickSort(b,0,b.length);
target=b[0]-1;
for(int c=0;c { int max=c+n/2;
if(b[c]==b[max])
{
target=b[c];
}
}
if(target!=b[0]-1)
{
for(int k=0;k {
if(a[k]==target)
{
result=k;
}
}
}
return result;
}
public static void main(String args[])
{
int []a={3,3,7,3,3,3,7,1,5,3,6};
int b= Dominator.dominator (a);
System.out.println(b);
}
}
2.这个题的主要优化算法是假设返回值current和数组长度相等,先把负数变成正数(0-a[i]),然后排序,然后设置一个最小值-1,因为现在数组里的元素的值都>=0;然后for遍历数组,如果后面一个的值大于前面一个,则前面的值为-1,最后,重新遍历数组,如果有值是-1的数,则current自减,最后返回current。
public class AbsDistinct {
static public int absDistinct (int []a)
{
int n=a.length;
int current=n;
int temp;
for(int i=0;i {
if(a[i]<0)
{
a[i]=0-a[i];
}
}
QuickSort. quickSort(a,0,a.length);
for(int k=1;k {
if(a[k]==a[k-1])
a[k-1]=-1;
}
for(int sum=0;sum {
if(a[sum]==-1)
{
current--;
}
}
return current;
}
public static void main(String args[])
{
int []a={-3,-7,0,7,3,8,10};
int b= AbsDistinct. absDistinct (a);
System.out.println(b);
}
}
3这是一个很经典的“动态规划算法”,这个算法不但代码简洁,而且效率是最高的。
public class MaxSliceSum {
public static int maxSliceSum (int[] a)
{
int n=a.length;
int b=0;
int sum=a[0];
for(int i=0;i {
if(b>0) b+=a[i];
else b=a[i];
if(b>sum) sum=b;
}
return sum;
}
public static void main(String args[])
{
int []a={10,-5,-7,2,4,5};
int b= MaxSliceSum. maxSliceSum (a);
System.out.println(b);
}
}


文章来源:http://www.bozhiyue.com/mianshiti/mianjingbijing/2016/0513/96141.html
返回上一页    返回分类 上一篇:   下一篇:
相关