百度2020校招Java研發工程師筆試卷(第一批)詳解
第一題:關於記憶體管理,下面說法不正確的是?
答案:A、C
程式的記憶體不一定都是從0開始。執行緒是作業系統能夠進行運算排程的最小單位,它被包含在程序之中,是程序中的實際運作單位。
記憶體管理分段與分頁:https://blog.csdn.net/weixin_44151739/article/details/108416656
第二題:下列關於圖的說法正確的是()
答案:B
圖不可以是空圖。
給定子圖的邊的結合E',定點的集合V',子圖 G'=(V',E'),在上述條件基礎之下 極小連通子圖: 用最少的邊使頂點連通 極大連通子圖: 用最多的邊使頂點連通
在有向圖G中,如果兩個頂點u,v間有一條從u到v的有向路徑,同時還有一條從v到u的有向路徑,則稱兩個頂點強連通。如果有向圖G的每兩個頂點都強連通,稱G是一個強連通圖。有向非強連通圖的極大強連通子圖,稱為強連通分量。
第三題:設無向圖G=(V,E),頂點集V={a,b,c,d,e,f,g,h},邊集E={(a,b),(a,h),(a,e),(b,c),(b,d),(c,d),(c,h),(e,f),(e,g)},則下列選項中,不屬於BFS序列的是()
答案:B
BFS遍歷
第四題:分頁儲存管理將程序的邏輯地址空間分成若干個頁,併為各頁加以編號,從0開始,若某一計算機主存按位元組編址,邏輯地址和實體地址都是32位,頁表項大小為4位元組,若使用一級頁表的分頁儲存管理方式,邏輯地址結構為頁號(20位),頁內偏移量(12位),則頁的大小是()位元組?頁表最大佔用()位元組?
答案:A
參考部落格:https://blog.csdn.net/syh666233/article/details/109295815
第五題:有以下程式段,下面正確的選項是
public static void main(String[] args) { System.out.print(test1()); } public static int test1() { int a = 20; try { return a + 25; } catch (Exception e) { System.out.println("test catch exception"); } finally { System.out.print(a + " "); a = a + 10; } return a; }
答案:D
finally語句在return之前執行。
參考部落格:https://blog.csdn.net/congduan/article/details/48275473
第六題:下列選項中,關於HTTP與HTTPS的區別的描述中,正確的是( ):
答案:A、B、C
http:80;https:443
第七題:執行緒池在我們的專案中經常會被用到,執行緒池的選擇基於我們的應用場景,那麼現在有這樣一個應用場景:需要週期性的執行任務,那麼我們應該選擇哪一個執行緒池()
答案:D
第八題:小牛開發檔案上傳功能時,遇到了一些安全問題,那麼對於檔案上傳漏洞,有效防禦手段有哪些?
答案:B、C
第九題:用下面哪些SQL語句可以從table中得到每門課都大於80分的學生姓名,下面說法正確的的?
namecoursefenshu 小張語文81 小張數學75 小李語文76 小李數學90 小王語文81 小王數學100 小王英語90答案:A、D
第十題:以下程式碼執行的結果是什麼
public class TestGC { private static TestGC TEST_GC = null; private void isAlive() { System.out.print("Yes,I'm Alive!" + "、"); } @Override protected void finalize() throws Throwable { super.finalize(); System.out.print("finalize mehtod executed!" + "、"); TestGC.TEST_GC = this; } public static void main(String[] args) throws Throwable { TEST_GC = new TestGC(); TEST_GC = null; System.gc(); Thread.sleep(500); if (TEST_GC != null) { TEST_GC.isAlive(); } else { System.out.print("NO,I'm dead!" + "、"); } TEST_GC = null; System.gc(); Thread.sleep(500); if (TEST_GC != null) { TEST_GC.isAlive(); } else { System.out.print("NO,I'm dead!"); } } }
答案:A
finalize()只會在物件記憶體回收前被呼叫一次
參考部落格:https://blog.csdn.net/a4171175/article/details/90749839
第十一題:對於java集合HashMap中的containsKey()方法,最好情況和最壞情況下的時間複雜度是
答案:A(JAVA1.8之前最壞情況是O(n),之後是O(logn))
在JDK1.7及之前,是用陣列加連結串列的方式儲存的。
但是,眾所周知,當連結串列的長度特別長的時候,查詢效率將直線下降,查詢的時間複雜度為 O(n)。因此,JDK1.8 把它設計為達到一個特定的閾值之後,就將連結串列轉化為紅黑樹。
參考部落格:https://zhuanlan.zhihu.com/p/129724004
第十二題:以下程式碼執行後會列印哪些內容
public class Test implements Runnable { @Override public void run() { while (!Thread.currentThread().isInterrupted()) { synchronized (this) { try { wait(); } catch (InterruptedException e) { System.out.println("InterruptedException"); } } } System.out.println("Final"); } public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(new Test()); thread.start(); new Thread(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { } thread.interrupt(); System.out.println("interrupt"); }).start(); thread.join(); System.out.println("exit"); } }
答案:A
參考部落格:https://www.jianshu.com/p/d901b25e0d4a
第十三題:假設存在學生資訊表student,選修課表course,如果想查詢所有學生的選修課以及成績,下面正確的sql語句是:
create table `student`( `id` int(11) not null auto_increment, `name` char(50) not null comment '學生姓名', `sid` int(11) not null comment '學號', primary key(`id`), unique key `sid`(`sid`) )engine = innodb; create table `course`( `id` int(11) not null auto_increment, `name` char(50) not null comment '課程名稱', `score` int(11) not null comment '成績', `sid` int(11) not null comment '學號', primary key(`id`) )engine = innodb;
答案:C、D
mysql cross join為笛卡爾全連線,inner join即為join
- JOIN: 如果表中有至少一個匹配,則返回行
- LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
- RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
- FULL JOIN: 只要其中一個表中存在匹配,就返回行
參考部落格:https://www.cnblogs.com/poloyy/p/12881918.html
第十四題:假如公司機房現在有n個伺服器,為了方便使用者會在伺服器上快取資料,因此使用者每次訪問的時候最好能保持同一臺伺服器,現有的做法是根據伺服器的ip%n計算得到請求的伺服器,如果現在一臺伺服器掛掉了,採用以下哪種做法(),能夠保證不會造成大面積的訪問錯誤;原有的訪問基本還是停留在同一臺伺服器上;儘量考慮負載均衡。
答案:A
參考部落格:https://blog.csdn.net/caigen1988/article/details/7708806?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.base
第十五題:將一個整數序列整理為降序,兩趟處理後序列變為{36,31,29,14,18,19,32}則採用的排序演算法可能是________。
答案:B
冒泡:i*j 兩兩比較,小的放前
選擇:i*j兩兩比較,遍歷j後,找到最小的放前面
插入:預設第一個排好序(只有一個,也沒得比較),第一步:第二個與第一個比較排序;第二步:第三個插入前面排好序的序列;第三步,第四個插入前面的序列,以此類推
希爾:類似插入排序,但第一步:分i//2堆(隨機分配)同步進行插入排序(第一堆排完,再第二堆,再第三堆…);第二步:分i//4堆依次排;…最後一步:一整堆進行插入排序,耗時i;
歸併:分而治之,dynamic programming
快排:定義分割槽函式,主函式遞迴排序
堆排:建立二叉樹,樹內排序,找到最大值取出,更新樹,再取出第二大的數…以此類推
計數:不用比較,犧牲空間換時間,開闢key為min到max的陣列,遍歷原序列,統計數的個數;再對key按順序輸出即可。
桶排:計數排序的升級,計數用了max-min+1個桶,桶排序用k個桶(數量更少),桶內排好序(用傳統方法,或遞迴用桶排),再對桶按順序輸出即可。
基數:同樣基於計數排序,先按個位數入列(0-9個列),排好第一步;再按十位數入列,排好第二步;…依次到最大位數入列,排好輸出即可。
分析
插入排序:第n趟前n+1個有序
選擇排序:第n趟前n個位置正確
快速排序:第n趟有n個元素位置正確
堆排序:第n趟前或後n個位置正確
參考部落格:https://blog.csdn.net/xxxxl0908/article/details/104702991/
第十六題:
資料結構中,二分法的查詢主要應用於資料量較大情況下的查詢,但是資料需要先排好順序,在順序表(2,5,7,10,14,15,18,23,35,41,52)中,用二分法查詢12,所需的關鍵碼比較的次數為多少()?
答案:C
二分比較次數
第十七題:設a陣列的長度為N,那麼下面程式迴圈內交換陣列元素的程式碼執行的時間複雜度最壞為?
for (int i = N - 1; i > 1; i--) { for (int j = 1; j < i; j++) { if (a[j] > a[j + 1]) { temp = a[j + 1]; a[j + 1] = a[j]; a[j] = temp; } } }
答案:B
選擇排序時間複雜度
第十八題:
如果儲存結構由陣列變為連結串列,那麼下列哪些演算法的時間複雜度量級會升高
答案:B、C
希爾排序、堆排序使用陣列儲存的話,方便獲取指定位置的資料。這兩個排序都需取指定位置的資料,而使用連結串列增加了獲取指定位置的時間。