2020年Java程序員面試算法寶典附答案

2020年Java程序員面試算法寶典附答案

,眾所周知,算法可以說是大廠面試Java程序員的必問面試題。相信算法的重要性大家都瞭解,好的算法可以讓性能得到萬倍提升,做到毫秒級處理千萬數據的程度。因此,為了提升大家在面試中的底氣,跟著小編往下看:


2020年Java程序員面試算法寶典附答案

1、算法的時間複雜度時候是什麼?

答案:算法的時間複雜度表示程序運行完成所需的總時間,它通常用大O表示法來表示。

2、合併k個有序(假設升序)數組的具體步驟是什麼?

答案:將k個數組的第一個元素取出來,維護一個小頂堆;彈出堆頂元素存入結果數組中,並把該元素所在數組的下一個元素取出來壓入隊中;調整堆的結構,使其滿足小頂堆的定義;重複前兩步直到合併完成。

3、解釋二分法檢索如何工作?

答案:在二分法檢索中,我們先確定數組的中間位置,然後將要查找的值與數組中間位置的值進行比較,若小於數組中間值,則要查找的值應位於該中間值之前,依此類推,不斷縮小查找範圍,直至得到最終結果。

代碼拓展,二分法查找

<code>    defBinarySearch(t,x):
    t.sort()#對列表進行排序,列表是有序的,是二分法的前提
    low=0;
    high=len(t)-1;
    whilelowx:
    high=mid-1;
    else:
    returnmid
    returnNon/<code>

4、查找數組中出現次數超過一半的數字

答案:等價於求數組中第n/2大的數,和4中思想一樣,平均時間複雜度O(n)

5、一個數組怎麼輸出前K大的值、時間複雜度?

答案:藉助快排partition的思想,平均時間複雜度是O(n)

6、用A表示1第一列,B表示2第二列,。。。,Z表示26,AA表示27,AB表示28。。。以此類推。請寫出一個函數,輸入用字母表示的列號編碼,輸出它是第幾列。

答案:這道題的解題思路關鍵在於26進制轉10進制。

7、輸入一個正數n,輸出所有和為n連續正數序列。

答案:輸入15,由於1+2+3+4+5=4+5+6=7+8=15,所以輸出3個連續序列1-5、4-6和7-8。

8、輸出一個整數二進制表示中1的個數。

答案:這道題的解法多樣,可以右移原數判斷,如果輸入是負數可能陷入死循環;也可以左移1;還可以把一個整數-1後與原數做與運算會消去原數最左邊的1。

9、在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

答案:這道算法面試題對大多數Java程序員來講並不難,大致的解題思路如下,我們注意到這個二維數組的行和列都是升序的,也就是說最上面的一行和最右邊的一列在整體上也是升序的,在一個排序數組上查找某個我們會很自然的想起二分法。這樣我們每次都把要查找的數和當前剩下的二維數組的右上角數字比較,這樣每次我們都可以排除掉一行或一列。算法的時間複雜度是O(n+m),也就是行數加列數。

10、兩個排序數組A1和A2,現在想把A2插入A1中並仍保持有序。

答案:數組是個順序表,我們往數組中插入某個數的話必須要移動當前位置後面所有的數。常規的思路是每次插入一個數並移動後面的數,這樣多次插入後會導致數組中有的數被移動了多次,極大浪費了效率。我們希望每個數移動一次就到達它最終的位置,所以我們往往會反向移動數組,這樣做的好處是移動當前數時後面的數已經到達了最終位置,我們移動當前數不會影響到後面的數,這樣就確保了每個數只被移動一次。



原文:2020年Java程序員面試算法寶典附答案

作者:動力節點

來源:網站


分享到:


相關文章: