因同學介紹,投了簡歷,去公司面試。報的是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));
}
}