小米2020校招軟件開發工程師筆試題二

1. 計算大於n(n>1)的最小的斐波那契數,以下劃線出應填入(B
function f(n:int){
	int[] a = new int[2];
	a[0] = a[1] = 1;
	int i =1 ;
	while(true){
		i = (i + 1)%2
		a[i] = ______
		If(a[i] > n){
			return a[i]
		}
	}
}

A. a[i] + a[i + 1]
B. a[i % 2] + a[(i+1)%2]
C. a[i] + a[i -1]
D. a[i%2] + a[(i-1)%2]

解析:
由於創建的數組只有2的容量,因此每一次while循環中都要進行模2操作,來確定當前值所在數組中的位置,排除A、C。第一次while循環,int i =1 ; i = (i + 1)%2 = 0,此時的 i - 1 出現數組越界,因此排除D

2.複雜度(D
void fun(int n) {
	int i=2;
	while(i<=n)
		i=i*i;
}

A. O(n)
B. O(n2)
C. O(√n)
D. O(log2n)

解析:
時間複雜度,就是執行次數最多的那個語句次數。
這段程序中,執行次數最多的就是 i = i * i;
其執行的次數爲:
i * i * i * i *…* i<=n
假設爲x次,
則 i x <= n
i x = n 可以推出 x = login\log_i{n}
i = 2
所以,時間複雜度爲 O( log2n\log_2{n})

3. 下面關於樹的遍歷算法說法錯誤的是?(A B

A. 先序遍歷屬於廣度優先遍歷算法
B. 中序遍歷屬於廣度優先遍歷算法
C. 中序遍歷屬於深度優先遍歷算法
D. 後序遍歷屬於深度優先遍歷算法

解析:
層序遍歷屬於廣度優先遍歷算法

4. 關於排序算法,以下的哪些敘述是正確的?(C D

A. 快速排序的最壞時間複雜度爲O(nlog(n)),它是一個不穩定排序
B. 冒泡排序的時間複雜度爲O(n^2),它是一個不穩定排序
C. 歸併排序的時間複雜度爲O(nlog(n)),它需要O(n)的額外存儲空間來完成排序
D. 堆排序的最壞時間複雜度爲O(nlog(n)),它不需要額外存儲空間來完成排序

解析:
快排最壞時間複雜度爲O(N2)
冒泡排序是穩定排序

5. 初始化序列爲9,1,10,7,6,5,2,8的一組數採用堆排序,當建大根堆完畢時,堆所對應的二叉樹中序遍歷序列爲:(D

A. 1 8 7 6 10 9 2 5
B. 7 1 8 6 10 5 9 2
C. 7 8 1 6 10 2 5 9
D. 1 7 8 6 10 5 9 2

解析:
在這裏插入圖片描述

6. 高度爲7的完全二叉樹的節點總數不可能是:(D

A. 128
B. 192
C. 255
D. 256

解析:
深度是從根節點數到它的葉節點,高度是從葉節點數到它的根節點。

7. 關係數據庫的事務具有下列哪些特點(A C D

A. 原子性
B. 併發性
C. 隔離性
D. 持久性

解析:
數據庫事務的特點:原子性、一致性、分離性、持久性

8. 下面笛卡爾積的基數計算正確的選項有哪些?(A D

A. D1={張三,李四,王五}, D2={男,女}, D3={北京,西安}, D1xD2xD3的基數 是12
B. D1={月亮,地球}, D2={行星,衛星}, D3={宜居,非宜居}, D1xD2xD3的基數是6
C. D1={張三,李四,王五}, D2={男,女}, D3={北京,西安}, D1xD2xD3的基數是7
D. D1={張三,李四,王五}, D2={男,女}, D3={北京,西安,海南}, D1xD2xD3的基數是18

解析:
基數 = 數據集的元素個數乘積

9. Linux父進程在fork一個子進程時如下哪些行爲在系統層不會發生:(D

A. 生成一個新的PID
B. 複製父進程的數據
C. 執行子進程函數
D. 父進程等待子進程終止後退出

解析:
https://blog.csdn.net/nan_lei/article/details/81636473

10. 下列描述中錯誤的是(A B D

A. 相比交換機,路由器可以提供更大的帶寬和數據轉發功能
B. 在IP分類地址方案中,159.226.181.1是一個C類地址。
C. IP協議利用TTL控制數據傳輸的時延。
D. HTTP的長連接可以永久保持。

解析:
A. 交換機可以提供更大的帶寬和數據轉發功能
B.在這裏插入圖片描述
D. 長連接具有過期時間,防止資源浪費

11. 已知:print()是一個類的常成員函數,無返回值,下列表示中正確的是(A

A. void print () const;
B. const void print ();
C. void const print ();
D. void print (const);

解析:
類的常成員函數聲明格式爲:類型說明符 函數名(參數表) const

12. 下面關於C++異常處理描述中,錯誤的是(A

A. 當異常處理語句找到一個匹配的catch異常處理後,將從對應的try塊開始到異常被拋擲處之間構造(且尚未析構)的所有棧對象和堆對象進行析構,這一過程稱爲解旋。
B. 一個異常安全的函數,在有異常拋出時不應泄露任何資源,且不能使任何對象進入非法狀態。
C. 爲實現異常安全的編程,應儘量確保析構函數不拋擲異常。
D. 函數聲明“void fun() throw();”表示該函數不拋擲任何類型異常;若無異常接口聲明,則此函數可以拋擲任何類型的異常。

解析:
https://blog.csdn.net/weixin_42380877/article/details/81272629
https://blog.csdn.net/misayaaaaa/article/details/89928087
棧解旋:當發生異常時,從進入try塊後,到異常被拋擲前,這期間在棧上的構造的所有對象都會被自動析構。析構的順序與構造的順序相反,這一過程被稱爲棧的解旋(unwinding)

13. 下面代碼段存在致命問題的是(A

A.

#include <stdio.h>
register int i = 0;
printf("i = %d, &i = %p\n", i, &i);

B.

#include <stdio.h>
int * restrict p = 0;
printf("p = %p\n", p);

C.

#include <stdio.h>
volatile int j = 0;
printf("j = %d, &j = %p\n", j, &j)

D.

#include <stdio.h>
int main(void) {
	int * k = malloc(8)
	printf("k = %d, &k = %p\n", *k, k);
	return 0;
}

解析:
無論寄存器變量實際上是不是存放在寄存器中,它的地址都是不能訪問的。

14. 關於析構函數和構造函數,下列說法正確的是(A B D

A. 若類中沒有定義構造函數和析構函數,則系統會給出隱含的默認構造函數和析構函數
B. 析構函數不能被繼承
C. 構造函數允許重載,且可以通過參數個數、參數類型或返回值來區分類的構造函數可以爲內聯函數、重載函數或帶默認形參值的函數
D. 類的構造函數可以爲內聯函數、重載函數或帶默認形參值的函數

解析:
https://www.cnblogs.com/chenwx-jay/p/inline_cpp.html
https://www.cnblogs.com/Kiven5197/p/8862382.html
函數名必須相同,返回值可以相同,也可以不同。參數個數不同;個數相同時類型不同;參數個數類型都相同時參數順序不同。這三種情況都滿足重載要求。也就是說重載函數區分的方法只能從函數的形參裏看。

15. 關於Java下列說法正確的是有幾個(A
  1. getDeclaredMethod方法能獲取一個類的父類方法
  2. 在finally語句塊中的return語句不一定可以被執行到
  3. final關鍵字修飾的方法內局部變量可以被多個線程共享
  4. Java 8中的interface的抽象方法可以用static修飾

A. 1
B. 2
C. 3
D. 4

解析:
A. Method[] getDeclaredMethods() 不止獲取一個, 所以A錯誤
B. 當try語句裏面包含System.exit(0)時, finally語句不會執行, 所以B正確
C. fianl 可以保證正在創建中的對象不能被其他線程訪問到, 所以C錯誤
D. java中抽象類的方法可以不能用static來修飾,自由抽象類的屬性可以。接口中的方法也不行,接口只是抽象類的一個特殊的。所以D錯誤
https://blog.csdn.net/xiaoxiaoxuanao/article/details/52573859

16. 以下哪些操作可能會導致JDK8方法區(Metaspace)溢出?(C D

A. 短時間內創建大量對象
B. 調用一個沒有退出條件的遞歸方法
C. 創建大量動態代理(生成大量Class並加載)
D. 加載一個包含大量class文件的Jar包

解析:
方法區存放的是Class類型信息,類名,常量池,修飾符,方法描述等信息。使用了過多的靜態變量。常量池也被大量的佔用。jvm在“運行期間” 產生了大量的類。導致填滿了方法區。比如使用反射,動態代理,字節碼生成技術會在運行期間產生大量的類和類型信息。如hibernate,spring第三方框架大量使用了cglib技術產生大量的動態類。大量的jsp在編譯生成java類時也有可能產生方法區溢出,GC對方法區的回收非常苛刻的,因爲對於一個類的回收條件就很嚴格。

17. 給定nums=[1,2,3,4,5],以下表達式的結果爲[3,4]的是哪個?(B

A. nums[2:-3]
B. nums[2:-2]
C. nums[3:-3]
D. nums[3:-2]

解析:
數組切片 正數從前往後的位置, 負數從後往前的位置

18. 以下說法正確的是?(C

A. Java代碼在執行時,JVM會先將Java代碼編譯爲字節碼,再講字節碼編譯爲所在平臺的C語言代碼
B. C++代碼在編譯後會變成所在平臺的C語言代碼
C. 某些情況下,編譯器會調整特定代碼的執行順序來提高代碼的執行效率
D. 說法都不正確

解析
通過volidate可以防止指令重排

19. 以下哪些是最簡DFA的特點(A B

A. 沒有兩個狀態是互相等價
B.沒有多餘狀態
C. 只有一箇中間態
D. 終態個數和初態個數相同

20. 關於溢出說法錯誤的是(D

A. 緩衝區溢出指的是寫入超過緩衝區能保存的最大數據量的數據
B. 忘記遞歸的結束條件會造成堆棧溢出
C. 防止緩衝區溢出的工作通常需要編譯器完成
D. 內存溢出指的是因未及時釋放導致系統可用內存越來越少

解析:
內存溢出(Out Of Memory,簡稱OOM)是指應用系統中存在無法回收的內存或使用的內存過多,最終使得程序運行要用到的內存大於能提供的最大內存。此時程序就運行不了,系統會提示內存溢出,有時候會自動關閉軟件,重啓電腦或者軟件後釋放掉一部分內存又可以正常運行該軟件,而由系統配置、數據流、用戶代碼等原因而導致的內存溢出錯誤,即使用戶重新執行任務依然無法避免。通常不會導致系統崩潰。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章