因同学介绍,投了简历,去公司面试。报的是Java工程师。
一开始,自我介绍,问了下项目,写二分查找插入,返回要插入的位置信息。
一个月前面试的时候也让写这个,但是觉得Java也挺好写的,就用Java写了,回去后也没有看看有没有错;今天写的时候因为刚看过快排,老是想着快排的东西,加上隔壁也有人在面试声音挺大觉得略吵,写得好乱,后来重新写了一下,但是似乎有错。
接着,把一个单链表倒着排,问算法。
我把尾指针接到头构成环,便于遍历,接着就是重新建一个。觉得很慢。后来想到的也是首尾交换,时间应该只是少了一半吧。
问了Java和C++的不同(JVM,那么JVM在不同操作系统中的实现是一样的吗?)问了Java中的类用过哪些,问了线程,同步(同步synchronized作用对象是什么?)。问StringBuilder是否用过。
问了排序方法,时间复杂度,让写快排。
问了TCP/IP HTTP,不是很会。
看我学过软工,问设计模式,让讲,我说mvc,他说那不算。。。问工厂模式,不会。
问为什么来游戏公司,是否喜欢玩游戏,能来多久,平时爱好,以后读研出国工作?
后来和同学交流,问到的内容:
两个单链表,如何判断是否交叉;
给一堆数,找最大的那个,找最大的5个?
数据库用的什么语言(.mdb)
多线程的同步问题,什么时候会死锁。
大概就这些了。回来后实现了一下,发现自己写的那个果然有错,我傻傻地用了递归(虽然也可以)。以下是刚刚写的二分查找和二分插入。
package sort;
public class BinarySearch {
/**
* @param args
*/
//用while语句实现二分
public static int binarySearch(int[] a, int key){
int left=0;
int right=a.length-1;
while(left<=right){
int mid=(left+right)/2;
if(key<a[mid]){
right=mid-1;
}
if(key>a[mid])
left=mid+1;
if(key==a[mid])
return mid;
}
return -1;
}
//用递归实现二分
public static int binarySearch1(int[] a, int key, int l, int r){
int mid=(l+r)/2;
if(l<=r){
System.out.println("left:"+l+" right:"+r+" mid:"+mid);
if(key<a[mid])
return binarySearch1(a,key,l,mid-1);
if(key>a[mid])
return binarySearch1(a,key,mid+1,r);
return mid;
}
else return -1;
}
//对应的插入,返回插入的位置
public static int binaryInsert(int[] a, int key){
int left=0;
int right=a.length-1;
while(left<right){
int mid=(left+right)/2;
if(key<a[mid]){
right=mid-1;
}
if(key>a[mid])
left=mid+1;
if(key==a[mid])
return mid;
}
return left;
}
public static int binaryInsert1(int[] a, int key, int l, int r){
int mid=(l+r)/2;
if(l<r){
if(key<a[mid])
return binaryInsert1(a,key,l,mid-1);
if(key>a[mid])
return binaryInsert1(a,key,mid+1,r);
return mid;
}
else return l;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a={1,2,3,5,7,9};
System.out.println(binaryInsert(a,4));
}
}