小米支付Java高级工程师面试

总共面了两轮,没见着HR,应该是没戏了。

第一轮,自我介绍。项目简单了解了下、jvm GC相关的,然后现场手写代码,问题为:

二分查找的算法。第一次使用了递归,有点问题,面试官看了说不要用递归,不常用,于是改成了循环;写的时候还是有问题,忘记了使用循环的条件,最后面试官提醒了下最终完成了,最终的代码大概是如下:

public static int biSearch(int[]array,inta){
int lo=0;
int hi=array.length-1;
int mid;
while(lo<=hi){
mid=(lo+hi)/2;
if(array[mid]==a){
return mid+1;
}else if(array[mid]
lo=mid+1;
}else{
hi=mid-1;
}
}return-1;
}

第二轮,闲聊了会儿,问题比较不常见,但是比较深刻,如:

1.Java中如何实现多重继承,我说可以写接口啊,面试官说如果不适用接口呢?我没说上来,面试官说没想过用内部类啊?恍然大悟、羞愧啊、过了年全忘记了。

2.try...catch..finally中的代码执行顺序。回答了之后,又问:多个catch的执行顺序和catch的匹配原则,这个还是有基础的;最后来了个嵌套的try..catch..finally,在内部的finally中加入return会怎么样?这个没回答上来。接下来是现场手写代码:

给了个整形数组,把他看成是一个整数,实现加一的算法,返回加一后的数组。第一次直接在while循环里整个for循环,总后返回处理过的数组;忘记了处理都是9的情况,这个时候数组长度将会需要扩展一位;在面试官的提示下完成了。代码修改后如下:

public static int[] arrayPlus(int[]array){
int len=array.length;
for(inti=len-1;i>=0;i--){
if(array[i]==9){
array[i]=0;
}else{
array[i]++;
break;
}
}
if(array[0]==0){
int[] result=new int[len+1];
result[0]=1;
return result;
}else{
return array;
}

还是一个数组,求元素的逆序数。比如两个元素下标为i、j,i>j && a[i]<a[j],表示逆序。我直接写了两个for循环,最终完成了,面试官说了俩次检查一下有没问题,我说没有了,就说那今天的面试就先到这里吧。

回家后马上code出来,发现有问题的,循环边界有问题,还有数组的长度是a.length,我给写成了a.length(),羞愧难当啊!如下是修改过的代码:

// 给一个整型数组,统计其中的逆序数量
public static intinvertedNum(int[]array) {
int num=0;
int len=array.length;
for(int i=0;i<=len-1;i++){
for(int j=i+1;j<=len-1;j++){
if(array[i]>array[j]){
++num;
}
}
}
return num;
}

面试总共大概2小时,没有笔试比较意外,总体感觉难度一般吧,面试官态度挺好的,不管结果了,也算是一次经验。

猜你喜欢

转载自worldly.iteye.com/blog/2357293