1. 程式人生 > >【面試】記一次A公司線上程式設計面試

【面試】記一次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修復後的)。。