【面試】記一次A公司線上程式設計面試
面試之前準備了很多諸如生產者消費者,ABC問題,手擼LRU啊,負載均衡演算法啊。。
結果題目一來感覺自己被辜負了,2333
措手不及,有點小緊張…
兩道leetCode easy(我感覺)難度的題目。。
後記,得知掛了。但我一頭霧水不知道掛在哪?
做的太慢了? 為什麼要出這兩道基礎題目?
還是我的工作經驗不太符合他們的要求,別人面著面著覺得不合適了?
這種題目肯定是隨機從題庫裡抽的,對你們而言並無參考性。沒什麼可以投機取巧的,唯手熟爾。。。 幸好我這是社招,有好多面… 不然怎麼可能出這麼簡單的題目
//評測題目: 1.查詢整數
輸入:一個有序陣列陣列,一個整數n
輸出:如果n在陣列裡,輸出n的位置;如果n不在陣列中輸出n可以插入的位置,插入後的陣列仍然有序
例如:
[1,3,5,6],5→2
[1,3,5,6],2→1
[1,3,5,6],7→4
[1,3,5,6],0→0
// 輸入: 一維陣列 輸出: 目標元素的位置
public class FindAndInsert {
public static void main(String[] args) {
FindAndInsert f = new FindAndInsert();
int [] arr = {1,3,6,8};
int key1 = 1;
int key2 = 7;
System.out.println(f.getLocation(arr,key2));
}
public int getLocation(int [] arr, int key){
int i;
for(i=0;i<arr.length;i++){
if(arr[i]>key){
insertArr(arr,i,key);
break;
}else if(arr[i]==key)
break;
//如果arr[i]<key 一直成立,最後就return了arr.length作為下標了
}
return i;
}
public void insertArr(int [] arr, int location,int key){
int [] arrP = new int[arr.length+1];
for(int i=0;i<arrP.length;i++){
if(i==location)
arrP[i] = key;
else if(i<location)
arrP[i] = arr[i];
else{
arrP[i] = arr[i-1];
}
}
//問題來了,如何將n+1長度的陣列傳給長度為n的定長陣列
}
}
分析
這道題不難。
遍歷陣列,遍歷過程中
①如果arr[i]>key直接停下來返回i的值並插入,
②如果等於返回i的值直接返回i的值,
③如果arr[i]< key繼續迴圈直到走出迴圈(key大於陣列中所有元素)或者出現①、②的情況。
問題在於 原來的陣列是長度為n,插入元素後的陣列長度為n+1。那麼肯定就換了一個數組了啊。。。 所以當時我問了以後考官跟我講不用形成新的陣列,我估計是這個原因
2.字串查詢
輸入:字串str1,字串str2
輸出:字串str2在字串str1中第一次出現的位置。如果沒有返回-1。
例如:str1=“www.baobao.com”str2=“baobao”->4
其它要求:不能使用字串類的的indexOf方法
public class IndexOf {
public static void main(String[] args) {
IndexOf m = new IndexOf();
String str1 = "www.taobao.com";
String str4 = "oba"; //6 中間子串
String str2 = "com"; //11 結尾子串
String str3 = "cox" ; //-1 不存在子串
String str5 = "www.taobao.coml"; //-1 超長子串
System.out.println(m.getLocation(str1,str5));
System.out.println(str1.indexOf(str5)); //驗證結果
}
public int getLocation(String src, String key) {
if(key.length()>src.length()) return -1;
int location = 0;
boolean lock1 = false;
char [] srcArr = src.toCharArray();
char [] keyArr = key.toCharArray();
for (int i = 0, j = 0; i < srcArr.length; i++) { // 只增src的下標
if (keyArr[j] != srcArr[i]) {
j = 0;
continue;
} else
j++;
if (j == keyArr.length) { //這步一定要放在j++之後,答題的時候把這個放在for迴圈的最頂端了,在某些特殊情況下會出BUG
lock1 = true;
location = i-(keyArr.length-1); //減去子串長度+1
break;
}
}
if (lock1)
return location;
else
return -1;
}
}
手有點生,花了點時間。。 這個沒啥疑問的
雖然即便沒有開頭的長度校驗也能得出正確的結論。但是這樣的話效率會更高,當目標子串長度大於源字串的時候直接return -1的更好。
將兩個字串分別打成char [] 。以源字串的陣列為標準srcArr, 子字串為遊標keyArr。
如果字元不同i+1而j不變,直到遇到相同的字元i++,j++。如果期間遇到不同的字元直接將j打回0,如果遍歷期間j能夠順利走到keyArr的末端直接終止迴圈,返回i-keyArr.length。並將flag = true。
如果在迴圈期間,j不能達到keyArr.length-1則return -1;
結果
兩道題目,第一道那麼簡單。。 第二道做的有bug(本文中的程式碼為bug修復後的)。。