勉強算是面經——1.諾瓦科技
崗位C++開發人員
專案不算
幾個核心的問題:
一.面向物件:
1.三要素:封裝,繼承,多型 (只讓解釋多型,這裡把三個都列出來)
封裝,把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。簡單的說,一個類就是一個封裝了資料以及操作這些資料的程式碼的邏輯實體。在一個物件內部,某些程式碼或某些資料可以是私有的,不能被外界訪問。通過這種方式,物件對內部資料提供了不同級別的保護,以防止程式中無關的部分意外的改變或錯誤的使用了物件的私有部分。
繼承,是指可以讓某個型別的物件獲得另一個型別的物件的屬性的方法。它支援按級分類的概念。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。通過繼承建立的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”。要實現繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實現。繼承概念的實現方式有二類:實現繼承與介面繼承。實現繼承是指直接使用基類的屬性和方法而無需額外編碼的能力;介面繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力;
多型,是指一個類例項的相同方法在不同情形有不同表現形式。簡單的理解就是事物的多種形態,專業的解釋:同一個實現介面,使用不同的例項而執行不同的操作。多型機制使具有不同內部結構的物件可以共享相同的外部介面。這意味著,雖然針對不同物件的具體操作不同,但通過一個公共的類,它們(那些操作)可以通過相同的方式予以呼叫。
2.(1)用面向物件的思維去描述一瓶水,需要定義哪些類? (2)再給你一罐咖啡,同時描述兩件物品,需要怎麼修改?
討論後的答案:定義“容器”類作為基類,私有屬性容積; 定義“瓶子”類和“罐子”類都是派生類,繼承“容器”類,私有屬性材料等; 水類通過介面訪問“瓶子”類(繼承“容器”類),得到一瓶水 咖啡類通過介面訪問“罐子”類(繼承“容器”類),得到一罐咖啡 (這樣還需要定義水類、咖啡類等,需要進一步抽象,並新增屬性)
或者直接把水、咖啡等寫成容器類的私有屬性,但感覺這樣不太好再修改。 (兩個問題不是一起問的,我一開始只考慮了一瓶的情況,只把瓶類作為基類;所以再跟進描述一罐咖啡時要重新修改基類)
二.資料結構:
1.基本概念:資料結構就是研究資料的邏輯結構和物理結構以及它們之間相互關係,並對這種結構定義相應的運算,而且確保經過這些運算後所得到的新結構仍然是原來的結構型別。
主要的邏輯結構:資料之間的相互關係。
- 集合 結構中的資料元素除了同屬於一種類型外,別無其他關係(把這個忘了)。
- 線性結構 資料元素之間一對一的關係
- 樹形結構 資料元素之間一對多的關係
- 圖狀結構或網狀結構 結構中的資料元素之間存在多對多的關係
2.重點問題了圖結構 (網上覆制來的一些基本概念,沒有引申鄰接矩陣和遍歷)
-
圖(Graph)是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(V,E),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。在圖中的資料元素,我們稱之為頂點(Vertex),頂點集合有窮非空。在圖中,任意兩個頂點之間都可能有關係,頂點之間的邏輯關係用邊來表示,邊集可以是空的。
-
圖按照邊的有無方向分為無向圖和有向圖。無向圖由頂點和邊組成,有向圖由頂點和弧構成。弧有弧尾和弧頭之分,帶箭頭一端為弧頭。
-
圖按照邊或弧的多少分稀疏圖和稠密圖。如果圖中的任意兩個頂點之間都存在邊叫做完全圖,有向的叫有向完全圖。若無重複的邊或頂點到自身的邊則叫簡單圖。
-
圖中頂點之間有鄰接點、依附的概念。無向圖頂點的邊數叫做度。有向圖頂點分為入度和出度。
-
圖上的邊或弧帶有權則稱為網。
-
圖中頂點間存在路徑,兩頂點存在路徑則說明是連通的,如果路徑最終回到起始點則稱為環,當中不重複的叫簡單路徑。若任意兩頂點都是連通的,則圖就是連通圖,有向則稱為強連通圖。圖中有子圖,若子圖極大連通則就是連通分量,有向的則稱為強連通分量。
-
無向圖中連通且n個頂點n-1條邊稱為生成樹。有向圖中一頂點入度為0其餘頂點入度為1的叫有向樹。一個有向圖由若干棵有向樹構成生成森林。
-
這部分自 Ouyang_Lianjun 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/qq_35644234/article/details/57083107?utm_source=copy
3.雙向連結串列
一個雙向連結串列插入節點,沒有要求寫程式碼,只是讓說思路。 程式碼從牛客網上找的
#include <iostream>
#include <stdio>
#include <stdlib>
template
<
typename
T>
typedef
struct
ListNode{
struct
ListNode* prio;
struct
ListNode* next;
T data;
}LISTNODE;
//在一個節點value之後插入節點data
struct
ListNode* Insert(ListNode* head,T value,T data){
ListNode* node=NULL;
ListNode* node2=NULL;
if
(!head)
return
NULL;
else
{
node=head;
while
(node->data!=value){
node=node->next;
}
if
(node==NULL)
return
NULL;
else
{
if
(node->next){
node2->prio=node;
node2->next=node->next;
node2->data=data;
node->next=node2;
node->next->prio=node2;
}
else
{
node2->prio=node;
node2->next=NULL;
node2->data=data;
node->next=node2;
}
}
}
node=head;
return
node;
}
struct
ListNode* deleteP(ListNode* head,T data){
if
(head==NULL){
return
NULL;
}
else
{
ListNode* node=NULL;
ListNode* node2=NULL;
for
(node=head;node!=NULL;node=node->next){
if
(node->data==data && node->next!=NULL){
node->prio->next=node->next;
node->next->prio=node->prio;
}
else
if
(node->data==data && node->next==NULL){
node->prio->next=NULL;
}
else
return
NULL;
}
}
node=head;
return
head;
}
三.其實面試官還打算問一些網路的問題,但我前兩個回答的實在太差,人家也沒有必要再問了。