2020軟微複試知識整理

前言

現在是2020年4月18日
大概還有20天北大軟微2020的複試,整理一下知識點
此文不僅僅是複試使用,今後找實習,春招秋招都會使用
收集常見CS面試問題
持久更新~~

數據結構&算法

1.樹的定義?
來個優雅的遞歸定義
樹是N個節點的集合(N >=0),N=0的情況沒有根節點
1)有且僅有一個根節點
2)當N>1時,可以分爲m個互不相交的集合,T1,T2…Tm,每個集合是根節點的一個子樹

2.TopK問題
冒泡排序 複雜度 O(n*k)
堆排序 複雜度 O(n*log(k))
隨機選擇+partition 複雜度O(n)

3.常見排序算法
不穩定的排序:快排 希爾排序 堆排序 選擇排序
複雜度O(n*log(n)):快排 堆排序 歸併排序

語言特性(C C++ Java Python)

C語言:

1.C語言的指針
Type *p,聲明指針變量,告訴計算機p這個指針指向的對象佔用多少字節
p可以理解成快捷方式,快捷方式存放的是你對象所在的地址
p多大?這個根據操作系統來,比如32位系統,尋址空間2^32,那麼p就是32個2進制數,等於4個字節,同理,64位系統,p是8個字節
比如 int *p=a,p存放的內容就是a所在地址的第一位,然後發現是int型,順着讀4個字節,得到的也就是a的值
分清這三個值:*是取內容,&是取地址
p的值:指向對象的地址
*p的值:指向對象的內容
&p的值:p的地址

野指針:指向不可用內存區域的指針,如何避免?指針釋放後置null

2.C語言的union
所有成員佔同一段內存,union佔用的內存等於最長成員佔的內存,
union使用到了內存覆蓋技術,共用體成員之間會相互影響,共用體在單片機中應用較多

C++
1.static作用?
詳細版:https://blog.csdn.net/majianfei1023/article/details/45290467

  • 隱藏,不能被其他文件訪問的全局變量和函數,其他文件可以取同名變量
    (靜態全局變量,靜態函數)
  • 唯一一次初始化,保證變量內容的持久(靜態局部變量)
  • 用來修飾類的函數or變量,表示屬於類且不屬於類對象的變量or函數

2.C++class 和struct的區別?
在C語言中struct不能定義函數,
在C++中struct能定義訪問級別和函數,C++ struct和class用法完全相同,使用struct定義類,所有成員的默認訪問級別是public,使用class定義類,所有成員的默認訪問級別是private

3.C++虛函數和純虛函數:
純虛函數,聲明瞭純虛函數的類不能生成對象,抽象類是不能定義對象的,只能創建派生類的對象,純虛函數要求繼承類必須重寫聲明函數,如果派生類沒有重寫定義純虛函數,派生類任然是一個抽象類,帶有純虛函數的類是抽象類,虛函數是c++用於實現多態的機制
定義爲虛函數 是爲了允許基類的指針來調用子類的這個函數
虛函數在子類中可以不重載,純虛函數必須在子類中實現
虛函數繼承了接口同時繼承了父類的實現,純虛函數僅僅留給子類一個必須重寫的接口

4.C++爲啥要設計引用這個東西?
將函數的形參定義爲引用,函數會修改參數的值,達到對象指針的效果

  • 爲了支持操作符重載,*可能被重載了
  • 不使用引用會帶來拷貝的臨時開銷,使用引用更高效
  • 避免指針是否爲null的判斷
    防止引用改變真值?使用 const &
void Func(Foo* foo); //c
void Func(const Foo& foo);//c++

5.C++和腳本語言的區別
c++、java是編程是需要定義好類型,需要編譯
腳本語言不需要編譯,在運行中天然跨平臺,比如瀏覽器中的JavaScript

6.C++中const和define
const修飾的值,在編譯過程中不能改變,編譯器會把它放到一個只讀的內存區(全局區)
define是純文本替換

7.C++ new和delete,C++的new和malloc的區別

new不僅分配了內存,還創建了對象,delete可以刪除由new分配的內存

  • new是關鍵字,malloc是函數,效率高於malloc
  • new和delete配對使用,malloc和free配對使用
  • new不需要指定開多大的內存,malloc需要
  • new和malloc都是在堆上開闢內存,new不僅開闢空間,還進行初始化

8.C++ extern
extern放在變量或者函數前面,表示該變量或函數已經在別的文件中定義好了,提示編譯器去別的模塊尋找,想要使用要加上include

9.函數傳參的三種方法?
傳值、傳址、傳引用
傳引用形參和實參是指向同一塊地址
傳址是形參的值(*p)是指向實參的地址

Java
1.Java回收機制
java回收機制是java虛擬機提供的能力,在空閒時間回收未被引用的對象佔據的內存空間

2.Java虛擬機
Java虛擬機屏蔽了與具體操作系統平臺相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行,跨平臺。

3.char在Java中統一佔2個字節

4.c++和Java的區別?

  • 內存管理:Java具有垃圾回收機制,c++沒有
  • Java不使用全局變量,而是在某個類定義一個公用的靜態變量完成全部變量的效果
  • Java一切都是對象
  • Java和c++ 數據類型所佔字節不同,Java有JVM,屏蔽掉平臺相關信息,統一int是4個字節,char是2個字節,float是4個字節等等
  • Java不使用指針,c++可以使用指針對某個內存地址進行顯式轉化後訪問c++私有成員,破壞安全性
  • Java不能運算符重載,C++可以重載

Python
1.is和==的區別?
is是同一性運算,判斷對象的id是否相同,a is bid(a)==id(b)
== 是判斷對象的value是否相同

計算機網絡

查看文章
https://blog.csdn.net/weixin_39666736/article/details/105552401
1.OSI模型全稱?OSI七層分別是?
open system interconnect 開發式系統互聯
物理層 鏈路層 網絡層 傳輸層 回話層 表示層 應用層

操作系統

1.進程和線程?
進程是資源分配的基本單位,線程是處理機調度的基本單位
進程有自己獨立的地址空間,同一個進程下的線程共享進程地址空間
進程之間的資源是獨立的,同一個進程下的線程共享進程的資源
會有線程安全問題

補:進程和程序的區別?

  1. 進程是動態的,程序是靜態的
  2. 進程具有一定生命週期,程序可以長期保存
  3. 1個程序可以對應多個進程,一個進程只能對應一個程序
  4. 進程由 程序、數據、PCB組成;程序是一組有序的指令

2.系統調用?
系統調用是應用程序同系統之間的接口
用戶爲了使用操作系統所提供的一些高級權限功能,如進程控制、讀寫
通過系統調用從用戶態轉化到內核態
使用線程作爲最小調度單位可以有效減少系統切換的開銷

3.中斷
0)中斷概念:中斷是指某個事件(如斷電、除0)發生時,系統中止現行程序運行,切換到處理該事件的程序,處理完畢後返回斷點,繼續執行
1)中斷流程:中斷請求 --> 中斷響應 --> 中斷保護 --> 中斷服務程序 --> 斷點恢復 --> 中斷返回
2)內中斷:cpu執行指令內部的事件,如爆棧,越界,算術溢出
外中斷:cpu執行指令外部的事件,如斷電,I/O
3)中斷要保存什麼?
PC(program count程序計數器)存放下一條指令的位置
PSW(program status word程序狀態字)
通用寄存器

4.windos文件系統和linux文件系統有哪些?
windows:FAT16 FAT32 NTFS(new Technolegy)
linux:一切對象都是文件 ext2 ext3 ext4

5.宏內核和微內核
windows是微內核(軟的os是內核)
linux是宏內核

6.PV操作?
PV操作是實現進程互斥和同步的方法,PV操作和信號量的處理相關,P表示申請資源,V表示釋放資源

7.內存的分區?

  • 棧區stack:存放參數值,局部變量的值
  • 堆區heap:由程序員分配釋放 比如malloc,new
  • 全局區(靜態區):全局變量和靜態變量都是放這裏
  • 文字常量區:存放常量字符串
  • 程序代碼區:存放函數體的二進制代碼

軟件工程

查看文章
https://blog.csdn.net/weixin_39666736/article/details/105583789

數據庫&SQL

SQL查看文章
https://blog.csdn.net/weixin_39666736/article/details/104530984

1.事務是什麼?四大特性?
事務是用戶定義的操作序列,是併發控制的單位,操作序列要麼全部執行,要麼全部不執行
A atom 原子性
C consistency 一致性
I isolation 隔離性
D durability 持久性

2.事務的隔離級別
i)未提交讀
ii)提交讀
iii)可重複讀
iv)可串行化

3.數據庫範式

  • 1NF(1 normal form)所有屬性不可分割
  • 2NF 不存在非主屬性對碼的部分依賴
  • 3NF 不存在非主屬性對碼的傳遞依賴
  • BC 不存在主屬性對碼的部分依賴和傳遞依賴

面向對象&設計模式

1.面向對象三大特性

  • 封裝
  • 繼承
  • 多態
    • Java實現多態三個條件? 繼承 重寫 向上轉型(父類引用指向子類對象)

2.類和類之間的關係?

  • 繼承:is-a 表示特殊和一般的關係
  • 實現:類和接口之間的關係
  • 組合:整體不存在了,部分會消亡
  • 聚合:has-a,類A的對象包含類B的對象
  • 依賴:類A使用到了類B,類B的變化會影響類A,關係具有臨時性、偶然性

類與類之間關係由弱到強:
無關係 --> 依賴 --> 關聯 --> 聚合 -->組合

3.繼承和派生?
繼承着重點是保持原有特性
派生着重點是增加新的特性

數學&nlp基礎

1.歐氏距離(歐幾里得距離) 曼哈頓距離?
歐式距離是最常見的那個,用的勾股定理
曼哈頓距離就是絕對值之差的和

2.蒙特卡洛方法
蒙特卡洛是一類隨機方法的統稱,這類方法的特點是,可以在隨機採樣上計算得到近似結果,隨着採樣的增多,得到正確結果的概率增大

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