<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          準(zhǔn)算法工程師從30+場秋招中總結(jié)出的超強(qiáng)面經(jīng)—C、Python與算法篇篇(含答案)

          共 13550字,需瀏覽 28分鐘

           ·

          2021-07-04 21:50

          ↑ 點(diǎn)擊藍(lán)字 關(guān)注極市平臺

          作者丨燈會
          來源丨極市平臺
          編輯丨極市平臺

          極市導(dǎo)讀

           

          作者燈會為21屆中部985研究生,七月份將入職某互聯(lián)網(wǎng)大廠cv算法工程師。在去年灰飛煙滅的算法求職季中,經(jīng)過幾十場不同公司以及不同部門的面試中積累出了CV總復(fù)習(xí)系列,此為C、Python與算法篇。 >>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺的最前沿

          系列文章:






          算法

          1.數(shù)組和鏈表的區(qū)別

          數(shù)組是將元素在內(nèi)存中連續(xù)存放,由于每個(gè)元素占用內(nèi)存相同,可以通過下標(biāo)迅速訪問數(shù)組中任何元素。

          鏈表是一種上一個(gè)元素的引用指向下一個(gè)元素的存儲結(jié)構(gòu),鏈表通過指針來連接元素與元素;

          (1)數(shù)組是連續(xù)存儲的,鏈表是散列存儲的。數(shù)組隨機(jī)訪問性強(qiáng)(通過下標(biāo)進(jìn)行快速定位),所以數(shù)組的查詢比鏈表要快,鏈表不能隨機(jī)查找,必須從第一個(gè)開始遍歷,查找效率低。(2)數(shù)組插入和刪除效率低(插入和刪除需要移動數(shù)據(jù)),鏈表插入刪除速度快(因?yàn)橛衝ext指針指向其下一個(gè)節(jié)點(diǎn),通過改變指針的指向可以方便的增加刪除元素)

          2.堆,棧,堆棧,隊(duì)列

          堆(heap):堆是一種經(jīng)過排序的樹形數(shù)據(jù)結(jié)構(gòu),每個(gè)結(jié)點(diǎn)都有一個(gè)值。堆通常是一個(gè)可以被看做一棵樹的數(shù)組對象。堆總是滿足下列性質(zhì):堆中某個(gè)節(jié)點(diǎn)的值總是不大于或不小于其父節(jié)點(diǎn)的值,堆總是一棵完全二叉樹。

          棧(stack): 它是一種具有后進(jìn)先出性質(zhì)的數(shù)據(jù)結(jié)構(gòu),也就是說后存放的先取,先存放的后取。

          堆棧本身就是棧.

          隊(duì)列是先進(jìn)先出,有出口和入口。

          3.堆和棧的區(qū)別:

          ①堆??臻g分配區(qū)別:1)、棧(操作系統(tǒng)):由操作系統(tǒng)自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧;2)、堆(操作系統(tǒng)):一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)可能由OS回收,分配方式倒是類似于鏈表。

          ②堆棧緩存方式區(qū)別:1)、棧使用的是一級緩存,他們通常都是被調(diào)用時(shí)處于存儲空間中,調(diào)用完畢立即釋放;2)、堆是存放在二級緩存中,生命周期由虛擬機(jī)的垃圾回收算法來決定(并不是一旦成為孤兒對象就能被回收)。所以調(diào)用這些對象的速度要相對來得低一些。

          堆:內(nèi)存中,存儲的是引用數(shù)據(jù)類型,引用數(shù)據(jù)類型無法確定大小,堆實(shí)際上是一個(gè)在內(nèi)存中使用到內(nèi)存中零散空間的鏈表結(jié)構(gòu)的存儲空間,堆的大小由引用類型的大小直接決定,引用類型的大小的變化直接影響到堆的變化

          棧:是內(nèi)存中存儲值類型的,大小為2M,超出則會報(bào)錯(cuò),內(nèi)存溢出

          ③堆棧數(shù)據(jù)結(jié)構(gòu)區(qū)別:堆(數(shù)據(jù)結(jié)構(gòu)):堆可以被看成是一棵樹,如:堆排序;棧(數(shù)據(jù)結(jié)構(gòu)):一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)。特點(diǎn):先進(jìn)后出

          4.堆和棧的訪問哪個(gè)更快

          棧是編譯時(shí)分配空間,而堆是動態(tài)分配(運(yùn)行時(shí)分配空間),所以棧的速度快。

          5.快排和堆排

          快速排序:最常用的排序算法,速度通常也是最快的。時(shí)間復(fù)雜度:O(nlogn)

          最壞:O(n^2) 空間復(fù)雜度:O(nlgn)  不穩(wěn)定(比如 5 3 3 4 3 8 9 10 11 這個(gè)序列,在中樞元素5和3交換就會把元素3的穩(wěn)定性打亂)

          實(shí)現(xiàn)原理:快排主要是通過選擇一個(gè)關(guān)鍵值作為基準(zhǔn)值。比基準(zhǔn)值小的都在左邊序列(一般是無序的),比基準(zhǔn)值大的都在右邊(一般是無序的)。依此遞歸,達(dá)到總體待排序序列都有序。

          堆排序:堆排序是指利用堆這種數(shù)據(jù)結(jié)構(gòu)進(jìn)行設(shè)計(jì)的一種排序算法。堆排序利用了大根堆(或小根堆)堆頂記錄的關(guān)鍵字最大(或最小)這一特征,使得在當(dāng)前無序區(qū)中選取最大(或最小)關(guān)鍵字的記錄變得簡單。

          時(shí)間復(fù)雜度:O(n*logn)特別適用于數(shù)據(jù)量很大的場合(百萬級數(shù)據(jù))。因?yàn)榭炫藕蜌w并排序都是基于遞歸的,數(shù)據(jù)量很大的情況下容易發(fā)生堆棧溢出。排序速度略低于快排。也是一種不穩(wěn)定的排序算法。

          6.介紹快排,描述一下最壞的情況

          時(shí)間復(fù)雜度:最好情況O(nlogn)——Partition函數(shù)每次恰好能均分序列,其遞歸樹的深度就為.log2n.+1(.x.表示不大于x的最大整數(shù)),即僅需遞歸log2n次;最壞情況O(n^2),每次劃分只能將序列分為一個(gè)元素與其他元素兩部分,這時(shí)的快速排序退化為冒泡排序,如果用數(shù)畫出來,得到的將會是一棵單斜樹,也就是說所有所有的節(jié)點(diǎn)只有左(右)節(jié)點(diǎn)的樹;平均時(shí)間復(fù)雜度O(nlogn)。

          解釋一下快排的思路,時(shí)間復(fù)雜度,穩(wěn)定嗎?(略,不穩(wěn)定) 穩(wěn)定的排序都有哪些?(插,歸并,冒泡) 解釋一下堆排序?(不斷得維護(hù)一個(gè)最大/小堆,時(shí)間復(fù)雜度nlgn)

          7.快排和堆排的優(yōu)缺點(diǎn)和應(yīng)用場景

          a : 時(shí)間復(fù)雜度都是o(nlogn)b : 效率: 快排 >歸并>堆排

          c : 三種算法的優(yōu)缺點(diǎn):快排: 極端情況下排序效率很低

          歸并:需要額外的內(nèi)存開銷,堆排序: 在快的排序算法中,相對較慢, 但應(yīng)用很廣.

          8.知道哪些排序算法 排序的空間復(fù)雜度 各種排序算法的原理

          冒泡排序、簡單選擇、直接插入、快速排序、堆排序、希爾排序、歸并排序、基數(shù)排序。

          冒泡排序:每當(dāng)相鄰的兩個(gè)數(shù)比較后發(fā)現(xiàn)它們的排序與排序要求相反時(shí),就將它們互換。

          快速排序:選擇一個(gè)基準(zhǔn)元素,通常選擇第一個(gè)元素或者最后一個(gè)元素,通過一趟掃描,將待排序的元素分成兩部分,一部分比基準(zhǔn)元素小,一部分大于等于基準(zhǔn)元素,此時(shí)基準(zhǔn)元素在其排好序后的正確位置,然后再用同樣的方法遞歸地排序劃分的兩部分。

          簡單選擇排序:在要排序的一組數(shù)中,選出最小的一個(gè)數(shù)與第一個(gè)位置的數(shù)交換;然后在剩下的數(shù)當(dāng)中再找最小的與第二個(gè)位置的數(shù)交換,如此循環(huán)到倒數(shù)第二個(gè)數(shù)和最后一個(gè)數(shù)為止。

          堆排序:堆排序是一種樹形選擇排序,是對直接排序的有效改進(jìn)。

          直接插入排序:在要排序的一組數(shù)中,假設(shè)前面(n-1)[n>=2]個(gè)數(shù)已經(jīng)是排好順序的,現(xiàn)在要把第n個(gè)數(shù)插到前面的有序數(shù)中,使得這n個(gè)數(shù)也是排好順序的。如此反復(fù)循環(huán),直到全部排好順序。

          希爾排序:先將要排序的一組數(shù)按某個(gè)增量d(n/2,n為要排序數(shù)的個(gè)數(shù))分成若干組,每組記錄的下標(biāo)相差d,對每組中全部元素進(jìn)行直接插入排序,然后再用一個(gè)較小的增量(d/2)對它進(jìn)行分組,在每組中再進(jìn)行直接插入排序。當(dāng)增量減至1時(shí),進(jìn)行直接插入排序后,排序完成。

          歸并排序:歸并(Merge)排序法是將兩個(gè)(或兩個(gè)以上)有序表合并成一個(gè)新的有序表,即把帶排序序列分為若干個(gè)子序列,每個(gè)子序列是有序的。然后再把有序子序列合并為整體有序序列。

          基數(shù)排序:將所有待比較數(shù)值(正整數(shù))統(tǒng)一為同樣的數(shù)位長度,數(shù)位較短的數(shù)前面補(bǔ)零。然后,從最低位開始,依次進(jìn)行一次排序。這樣從最低位排序一直到最高位排序完成以后,數(shù)列就變成一個(gè)有序序列。

          9.二叉樹、平衡二叉樹、完全二叉樹、滿二叉樹

          二叉樹的概念:一棵二叉樹是節(jié)點(diǎn)的一個(gè)有限集合,該集合或者為空,或者由一個(gè)根節(jié)點(diǎn)加上兩棵左子樹和右子樹組成。

          平衡二叉樹,又稱AVL樹。它或者是一棵空樹,或者是具有下列性質(zhì)的二叉樹:它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的高度之差之差的絕對值不超過1.。

          滿二叉樹:一個(gè)二叉樹,如果每一個(gè)層的結(jié)點(diǎn)數(shù)都達(dá)到最大值,則這個(gè)二叉樹就是滿二叉樹。也就是說,如果一個(gè)二叉樹的層數(shù)為K,且結(jié)點(diǎn)總數(shù)是(2^k) -1 ,則它就是滿二叉樹。

          完全二叉樹:葉子節(jié)點(diǎn)只能分布在樹的倒數(shù)第1層和倒數(shù)第二層,倒數(shù)第二層的節(jié)點(diǎn)必須是滿的,倒數(shù)第一層的節(jié)點(diǎn)可以不全是滿的,但是所有的節(jié)點(diǎn)都只能集中在樹的左側(cè)。這也說明,倒數(shù)第二層的節(jié)點(diǎn)肯定不會出現(xiàn)只有右子樹,沒有左子樹的情況。在構(gòu)建完全二叉樹時(shí),插入節(jié)點(diǎn)一定先插入左子樹,再插入右子樹。

          10.為什么要構(gòu)造成二叉樹,N叉樹可不可以

          二叉樹是按值來保存元素,也按值來訪問元素。

          11.紅黑樹

          紅黑樹是一種自平衡樹,它也是一顆二叉樹。既然能保持平衡,說明它和 AVL 樹類似,在插入或者刪除時(shí)肯定有調(diào)整的過程,只不過這個(gè)調(diào)整過程并不像 AVL 樹那樣繁瑣。為何紅黑樹使用得比 AVL 樹更多,就是因?yàn)榧t黑樹它的調(diào)整過程迅速且簡介。紅黑樹有以下五個(gè)特性:性質(zhì)1:節(jié)點(diǎn)是紅色或黑色

          性質(zhì)2:根是黑色

          性質(zhì)3:所有葉子都是黑色。葉子是 NIL 節(jié)點(diǎn),也就是 Null 節(jié)點(diǎn)

          性質(zhì)4:如果一個(gè)節(jié)點(diǎn)是紅的,則它的兩個(gè)兒子都是黑的

          性質(zhì)5:從任一節(jié)點(diǎn)到其葉子的所有簡單路徑都包含相同數(shù)目的黑色節(jié)點(diǎn)。

          12.遞歸有什么缺點(diǎn) A:當(dāng)遞歸層數(shù)很多的時(shí)候,容易造成內(nèi)存溢出

          13.遇到哈希沖突怎么辦

          ①開放定址法:為產(chǎn)生沖突的地址求得一個(gè)地址序列(),其中。其中m為表的長度,而增量有三種取值方法,線性探測再散列,平方探測再散列,隨即探測再散列。

          ②鏈地址法:將所有Hash地址相同的記錄都鏈接在同一鏈表中,再Hash法,同時(shí)構(gòu)造多個(gè)不同的Hash函數(shù),當(dāng)產(chǎn)生沖突時(shí),計(jì)算另一個(gè)Hash函數(shù)地址直到不再發(fā)生沖突為止。

          ③建立公共溢出區(qū):將Hash表分為基本表和溢出表,若是與基本表發(fā)生沖突,都放入溢出表。

          14.跳表

          跳表是一個(gè)隨機(jī)化的數(shù)據(jù)結(jié)構(gòu),實(shí)質(zhì)就是一種可以進(jìn)行二分查找的有序鏈表,跳表在原有的有序鏈表上面增加了多級索引,通過索引來實(shí)現(xiàn)快速查找,跳表不僅能提高搜索性能,同時(shí)也可以提高插入和刪除操作的性能。

          15.動態(tài)規(guī)劃和分治的區(qū)別與聯(lián)系,各自適應(yīng)哪些情況

          動態(tài)規(guī)劃:通過把原問題分解為相對簡單的子問題的方式求解復(fù)雜問題的方法。動態(tài)規(guī)劃常常適用于有重疊子問題和最優(yōu)子結(jié)構(gòu)性質(zhì)的問題。

          分治法的基本思想:將一個(gè)難以直接解決的大問題,分割成一些規(guī)模較小的相同問題,以便各個(gè)擊破,分而治之。

          共同點(diǎn):二者都要求原問題具有最優(yōu)子結(jié)構(gòu)性質(zhì),都是將原問題分而治之,分解成若干個(gè)規(guī)模較小(小到很容易解決的程序)的子問題.然后將子問題的解合并,形成原問題的解.

          不同點(diǎn):分治法將分解后的子問題看成相互獨(dú)立的,通過用遞歸來做。

          動態(tài)規(guī)劃將分解后的子問題理解為相互間有聯(lián)系,有重疊部分,需要記憶,通常用迭代來做。

          16.圖的遍歷方式

          從圖中某一頂點(diǎn)出發(fā)訪遍圖中其余頂點(diǎn),且使每一個(gè)頂點(diǎn)僅被訪問一次,這一過程就叫做圖的遍歷。根據(jù)遍歷路徑的不同,通常有兩種遍歷圖的方法:深度優(yōu)先遍歷和廣度優(yōu)先遍歷。它們對無向圖和有向圖都適用。圖的遍歷算法是求解圖的連通性問題、拓?fù)渑判蚝颓箨P(guān)鍵路徑等算法的基礎(chǔ)。

          C++

          1.指針和引用的區(qū)別

          指針指向一塊內(nèi)存,它的內(nèi)容是內(nèi)存中的地址,而引用則是某個(gè)內(nèi)存的別名,它的指向不改變。

          本質(zhì)區(qū)別:指針有自己的一塊空間(地址),而引用只是一個(gè)別名。

          使用sizeof看一個(gè)指針的大小是4(64位是8),而引用是被引用對象的大小。指針可以被初始化為NULL,而引用必須被初始化且必須是一個(gè)已有對象的引用??梢杂衏onst指針,但是沒有const引用。指針在使用中可以指向其他對象,但是引用還只能是一個(gè)對象的引用,不能被改變。如果返回動態(tài)內(nèi)存分配的對象或者內(nèi)存,必須使用指針,引用可能引起內(nèi)存泄漏。

          2.智能指針

          c++里面的四個(gè)智能指針: auto_ptr, shared_ptr, weak_ptr, unique_ptr

          3.多態(tài)的作用、多態(tài)機(jī)制

          接口的多種不同的實(shí)現(xiàn)方式即為多態(tài)。多態(tài)性是允許你將父對象設(shè)置成為一個(gè)或更多的他的子對象相等的技術(shù)。多態(tài)就是當(dāng)發(fā)出一條命令時(shí),不同的對象接收到同樣的命令后所做出的動作是不同的。

          機(jī)制:多態(tài)通常有兩種實(shí)現(xiàn)方法:子類繼承父類(extends)、類實(shí)現(xiàn)接口(implements);無論是哪種方法,其核心之處就在于對父類方法的改寫或?qū)涌诜椒ǖ膶?shí)現(xiàn),以取得在運(yùn)行時(shí)不同的執(zhí)行效果。要使用多態(tài),在聲明對象時(shí)就應(yīng)該遵循一條法則:聲明的總是父類類型或接口類型,創(chuàng)建的是實(shí)際類型。

          作用:多態(tài)最大的用途我認(rèn)為在于對設(shè)計(jì)和架構(gòu)的復(fù)用。

          4.虛函數(shù)

          虛函數(shù):實(shí)現(xiàn)類的多態(tài)性。

          定義一個(gè)函數(shù)為虛函數(shù),不代表函數(shù)為不被實(shí)現(xiàn)的函數(shù)。定義他為虛函數(shù)是為了允許用基類的指針來調(diào)用子類的這個(gè)函數(shù)。定義一個(gè)函數(shù)為純虛函數(shù),才代表函數(shù)沒有被實(shí)現(xiàn)。

          C++中的虛函數(shù)的作用主要是實(shí)現(xiàn)了多態(tài)的機(jī)制?;惗x虛函數(shù),子類可以重寫該函數(shù);在派生類中對基類定義的虛函數(shù)進(jìn)行重寫時(shí),需要在派生類中聲明該方法為虛方法。

          C++里調(diào)用虛函數(shù)比調(diào)用普通函數(shù)慢:普通函數(shù)快,因?yàn)榈刂吩诰幾g期間指定,單純的尋址調(diào)用。虛函數(shù)調(diào)用時(shí),首先找虛函數(shù)表,然后找偏移地址進(jìn)行調(diào)用。

          5.虛函數(shù)表放在哪里,虛表指針什么時(shí)候初始化

          虛函數(shù)表和靜態(tài)成員變量一樣,存放在全局?jǐn)?shù)據(jù)區(qū).

          在構(gòu)造函數(shù)中進(jìn)行虛表的創(chuàng)建和虛表指針的初始化。

          6.純虛函數(shù)(純虛函數(shù)在子類中沒有實(shí)現(xiàn)會不會報(bào)錯(cuò):會)

          純虛函數(shù)是在基類中聲明的虛函數(shù),它在基類中沒有定義,但要求任何派生類都要定義自己的實(shí)現(xiàn)方法。在基類中實(shí)現(xiàn)純虛函數(shù)的方法是在函數(shù)原型后加 =0:

          定義純虛函數(shù)是為了實(shí)現(xiàn)一個(gè)接口,起到一個(gè)規(guī)范的作用,規(guī)范繼承這個(gè)類的程序員必須實(shí)現(xiàn)這個(gè)函數(shù)。

          7.虛函數(shù)和純虛函數(shù)的區(qū)別

          含有純虛函數(shù)的類稱為抽象類,只含有虛函數(shù)的類不能稱為抽象類。虛函數(shù)可以直接被使用,也可以被子類重載以后以多態(tài)形式調(diào)用,而純虛函數(shù)必須在子類中實(shí)現(xiàn)該函數(shù)才可使用,因?yàn)榧兲摵瘮?shù)在基類中只有聲明而沒有定義。虛函數(shù)必須實(shí)現(xiàn),對虛函數(shù)來說父類和子類都有各自的版本。

          8.繼承是什么意思?

          繼承是指一個(gè)對象直接使用另一對象的屬性和方法。

          繼承機(jī)制是面向?qū)ο蟪绦蛟O(shè)計(jì)使代碼可以復(fù)用的最重要的手段,它允許程序員在保持原有的特性基礎(chǔ)上進(jìn)行擴(kuò)展,增加功能,這樣產(chǎn)生新的類,稱作是派生類。繼承呈現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)的層析結(jié)構(gòu),體現(xiàn)了由簡單到復(fù)雜的認(rèn)知過程。繼承是類設(shè)計(jì)層次的復(fù)用。

          9.C++的繼承和Java繼承的區(qū)別?

          c++支持多重繼承,java不支持多繼承;

          虛繼承:當(dāng)我們在繼承方式前加virtual 關(guān)鍵字,進(jìn)行虛繼承,虛繼承內(nèi)存中會通過虛基類指針指向虛基類表,該表中的數(shù)據(jù)是為虛基類指針到基類的存儲區(qū)域的偏移值。

          虛繼承:主要解決內(nèi)存重復(fù)的問題,同時(shí)避免訪問沖突。

          10.枚舉類能否繼承

          枚舉的作用:限定“數(shù)據(jù)集”中的元素的個(gè)數(shù)(將類理解為一個(gè)集合)、即限定枚舉類對象的個(gè)數(shù)。枚舉類也是類,也可以有自己的成員變量,成員方法,靜態(tài)方法、靜態(tài)變量等,也能實(shí)現(xiàn)其他的接口,不能繼承其他類了。

          11.類中繼承的方式,為什么會有這幾種方式,作用是什么

          public 繼承:父類成員在子類中保持原有訪問級別;

          private 繼承:父類成員在子類中變?yōu)樗接谐蓡T;

          protected 繼承:父類中的公有成員變?yōu)楸Wo(hù)成員,其它成員保持不變;

          12.深拷貝淺拷貝區(qū)別

          假設(shè)B復(fù)制了A,修改A的時(shí)候,看B是否發(fā)生變化:如果B跟著也變了,說明是淺拷貝,拿人手短?。ㄐ薷亩褍?nèi)存中的同一個(gè)值);如果B沒有改變,說明是深拷貝,自食其力!(修改堆內(nèi)存中的不同的值)。

          淺拷貝(shallowCopy)只是增加了一個(gè)指針指向已存在的內(nèi)存地址,深拷貝(deepCopy)是增加了一個(gè)指針并且申請了一個(gè)新的內(nèi)存,使這個(gè)增加的指針指向這個(gè)新的內(nèi)存。

          區(qū)別:深復(fù)制和淺復(fù)制最根本的區(qū)別在于是否是真正獲取了一個(gè)對象的復(fù)制實(shí)體,而不是引用。淺復(fù)制 —-只是拷貝了基本類型的數(shù)據(jù),而引用類型數(shù)據(jù),復(fù)制后也是會發(fā)生引用,我們把這種拷貝叫做“(淺復(fù)制)淺拷貝”,換句話說,淺復(fù)制僅僅是指向被復(fù)制的內(nèi)存地址,如果原地址中對象被改變了,那么淺復(fù)制出來的對象也會相應(yīng)改變。深復(fù)制 —-在計(jì)算機(jī)中開辟了一塊新的內(nèi)存地址用于存放復(fù)制的對象。

          13.拷貝和賦值的區(qū)別

          拷貝分為:賦值,淺拷貝,深拷貝,拷貝程度一次遞增;賦值:賦值就是相當(dāng)于做了個(gè)軟連接,所以不管你是修改了鏈接文聯(lián)的內(nèi)容還是源文件的內(nèi)容,這個(gè)文件都會有所改變(相當(dāng)于鏡子里的自己,你動他也動).淺拷貝:只是做了部分的拷貝,何謂部分拷貝?就是在賦值的基礎(chǔ)上減去了列表最外層的鏈接,其他的和賦值基本一樣.深拷貝:相當(dāng)于把文件復(fù)制了一份,新文件或老文件的改變都是互不相干的,完全獨(dú)立于老文件。

          14. int func(int *a, int *b) 和 int func(int a, int b) 的區(qū)別

          一個(gè)用指針做參數(shù),一個(gè)用自變量做參數(shù)。

          15.面向?qū)ο驝++的三個(gè)特性


          封裝:把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作,對不可信的進(jìn)行信息隱藏。

          繼承:面向?qū)ο缶幊?(OOP) 語言的一個(gè)主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進(jìn)行擴(kuò)展。

          多態(tài):多態(tài)性(polymorphisn)是允許你將父對象設(shè)置成為和一個(gè)或更多的他的子對象相等的技術(shù),賦值之后,父對象就可以根據(jù)當(dāng)前賦值給它的子對象的特性以不同的方式運(yùn)作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。

          16. C++類構(gòu)造函數(shù)和析構(gòu)函數(shù)

          構(gòu)造函數(shù)是一個(gè)特殊的公共成員函數(shù),它在創(chuàng)建類對象時(shí)會自動被調(diào)用,用于構(gòu)造類對象。

          類的構(gòu)造函數(shù)是類的一種特殊的成員函數(shù),它會在每次創(chuàng)建類的新對象時(shí)執(zhí)行。構(gòu)造函數(shù)的名稱與類的名稱是完全相同的,并且不會返回任何類型,也不會返回 void。構(gòu)造函數(shù)可用于為某些成員變量設(shè)置初始值。

          類的析構(gòu)函數(shù)是類的一種特殊的成員函數(shù),它會在每次刪除所創(chuàng)建的對象時(shí)執(zhí)行。析構(gòu)函數(shù)的名稱與類的名稱是完全相同的,只是在前面加了個(gè)波浪號(~)作為前綴,它不會返回任何值,也不能帶有任何參數(shù)。析構(gòu)函數(shù)有助于在跳出程序(比如關(guān)閉文件、釋放內(nèi)存等)前釋放資源。

          17.構(gòu)造函數(shù)和析構(gòu)函數(shù)的作用

          構(gòu)造函數(shù)的作用:用于新建對象的初始化工作。

          析構(gòu)函數(shù)的作用:用于在撤銷對象前,完成一些清理工作,比如:釋放內(nèi)存等。

          每當(dāng)創(chuàng)建對象時(shí),需要添加初始化代碼時(shí),則需要定義自己的構(gòu)造函數(shù);

          而對象撤銷時(shí),需要自己添加清理工作的代碼時(shí),則需要定義自己的析構(gòu)函數(shù)。

          18.C++中虛析構(gòu)函數(shù)的作用

          虛析構(gòu)函數(shù)是為了避免內(nèi)存泄露,而且是當(dāng)子類中會有指針成員變量時(shí)才會使用得到的。也就說虛析構(gòu)函數(shù)使得在刪除指向子類對象的基類指針時(shí)可以調(diào)用子類的析構(gòu)函數(shù)達(dá)到釋放子類中堆內(nèi)存的目的,而防止內(nèi)存泄露的。

          19. C++中malloc和new的區(qū)別

          1)malloc與free是C++/C語言的標(biāo)準(zhǔn)庫函數(shù),new/delete是C++的運(yùn)算符。它們都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存。

          2)對于非內(nèi)部數(shù)據(jù)類型的對象而言,光用maloc/free無法滿足動態(tài)對象的要求。對象在創(chuàng)建的同時(shí)要自動執(zhí)行構(gòu)造函數(shù),對象在消亡之前要自動執(zhí)行析構(gòu)函數(shù)。由于malloc/free是庫函數(shù)而不是運(yùn)算符,不在編譯器控制權(quán)限之內(nèi),不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加于malloc/free。

          3)因此C++語言需要一個(gè)能完成動態(tài)內(nèi)存分配和初始化工作的運(yùn)算符new,以一個(gè)能完成清理與釋放內(nèi)存工作的運(yùn)算符delete。注意new/delete不是庫函數(shù)。

          4)C++程序經(jīng)常要調(diào)用C函數(shù),而C程序只能用malloc/free管理動態(tài)內(nèi)存。

          20. C++中struct和class的區(qū)別

          對于成員訪問權(quán)限以及繼承方式,class默認(rèn)都是private,struct默認(rèn)是public;class可以用于表示模板類型,struct不行;一般來說,用到繼承時(shí)常用class,沒用到繼承時(shí)則使用struct。

          21. C++ static、const

          Static:如果某個(gè)屬性為整個(gè)類所共有,不屬于任何一個(gè)具體對象,則采用 static 關(guān)鍵字來聲明靜態(tài)成員。

          Const:常對象是這樣的對象:它的數(shù)據(jù)成員值在對下崗的整個(gè)生存周期內(nèi)不能被改變,也就是說,常對象必須進(jìn)行初始化而且不能被更新!

          什么時(shí)候用static:需要一個(gè)數(shù)據(jù)對象為整個(gè)類而非某個(gè)對象服務(wù),同時(shí)又力求不破壞類的封裝性,即要求此成員隱藏在類的內(nèi)部,對外不可見。

          static關(guān)鍵字的作用:常用來修飾變量。全局變量被static修飾后,就稱之為靜態(tài)全局變量;局部變量被static修飾后,就稱之為靜態(tài)局部變量。統(tǒng)稱為靜態(tài)變量。

          22. const和#define的區(qū)別

          ①編譯器處理方式不同:define宏是在預(yù)處理階段展開,const常量是編譯運(yùn)行階段使用。

          ②類型和安全檢查不同:define宏沒有數(shù)據(jù)類型,不做任何類型檢查,僅僅是展開。const常量有具體的數(shù)據(jù)類型,在編譯階段會執(zhí)行類型檢查。③存儲方式不同:define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內(nèi)存。const常量會在內(nèi)存中分配(可以是堆中也可以是棧中)。④代碼調(diào)試不同:const常量可以進(jìn)行調(diào)試的。define是不能進(jìn)行調(diào)試的,因?yàn)樵陬A(yù)編譯階段就已經(jīng)替換掉了。

          23.C++的棧區(qū)和堆區(qū)知道嗎?(棧區(qū)是存儲函數(shù)內(nèi)部變量的內(nèi)存區(qū),堆區(qū)是存動態(tài)申請的內(nèi)存)

          24. C++里面vector、list、deque的區(qū)別

          vector:vector是連續(xù)內(nèi)存空間,支持高效的隨機(jī)存取和尾部插入刪除,對其他位置插入刪除不方便,對比數(shù)組是可以自由動態(tài)增加空間。(偽動態(tài),也是構(gòu)造新一片內(nèi)存空間,拷貝舊空間數(shù)據(jù)到新空間,釋放舊空間)

          deque:邏輯上的連續(xù)內(nèi)存空間,支持高效的隨機(jī)存取和頭尾部雙端插入刪除。在中間進(jìn)行插入刪除也需要進(jìn)行大量的數(shù)據(jù)移動。

          List:雙向循環(huán)鏈表,支持高效的插入和刪除,對隨機(jī)存取不方便。

          如果想要高效的存取,不在乎插入和刪除的效率,選用vector.

          如果需要大量的刪除和插入操作,不關(guān)心隨機(jī)存取,選用list

          如果需要高效的存取,同時(shí)在乎首尾的插入和刪除,選用deque.

          25.struct和union有什么區(qū)別

          ①共用體和結(jié)構(gòu)體都是由多個(gè)不同的數(shù)據(jù)類型成員組成, 但在任何同一時(shí)刻, 共用體只存放了一個(gè)被選中的成員, 而結(jié)構(gòu)體的所有成員都存在。

          ②對于共用體的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對于結(jié)構(gòu)體的不同成員賦值是互不影響的。

          26. C++中include時(shí)如何保證不重復(fù)加載頭文件

          #ifndef方式、#pragma once方式

          27. C++11里面auto有什么用,不給初始值可以嗎

          C++11中對關(guān)鍵字auto進(jìn)行了重新定義,可以讓編譯器根據(jù)初始值類型自動推斷變量的類型。用auto聲明的變量必須初始化

          28.點(diǎn)積和叉乘

          向量的點(diǎn)積:向量點(diǎn)積是其各個(gè)分量乘積的和

          幾何意義:點(diǎn)積的結(jié)果是一個(gè)標(biāo)量,等于向量大小與夾角的cos值的乘積。

          叉乘:

          29. C++、Java、Python的主要區(qū)別 (編譯型語言和解釋性語言)

          編譯型語言:c, c++, Delphi,java,等;解釋性語言:c#, python,Ruby, javascript.

          30. STL中 vector 是怎么實(shí)現(xiàn)的?我答了用數(shù)組實(shí)現(xiàn),然后常數(shù)時(shí)間訪問,內(nèi)存分配。內(nèi)存不夠在原有基礎(chǔ)上擴(kuò)大一倍分配。

          31.python和C的區(qū)別

          ①語言類型:Python是一種基于解釋器的語言,解釋器會逐行讀取代碼;首先將Python編譯為字節(jié)碼,然后由大型C程序解釋。C是一種編譯語言,完整的源代碼將直接編譯為機(jī)器代碼,由CPU直接執(zhí)行。

          ②內(nèi)存管理:Python使用自動垃圾收集器進(jìn)行內(nèi)存管理。在C語言中,程序員必須自己進(jìn)行內(nèi)存管理。

          ③應(yīng)用:Python是一種通用編程語言,一個(gè)多范式。它主要支持面向?qū)ο缶幊蹋绦蚓幊?,函?shù)編程。C是結(jié)構(gòu)化編程語言。允許使用函數(shù),選擇(if / else等),迭代(循環(huán))。它主要用于硬件相關(guān)的應(yīng)用程序。

          ④速度:Python編程語言因?yàn)闅v史原因,有一個(gè)GIL鎖,導(dǎo)致其對多線程支持不夠好,運(yùn)行速度較慢;而C語言很快,C語言是比較底層的語言,運(yùn)行效率上要優(yōu)于Python。

          ⑤復(fù)雜度不一樣:在Python中,不需要聲明變量類型。而在C中,必須聲明變量類型。Python程序更易于學(xué)習(xí),編寫和閱讀。而C程序語法比Python更難。Python中的測試和調(diào)試更容易;而在C中測試和調(diào)試更難。

          32.什么時(shí)候要進(jìn)行動態(tài)內(nèi)存申請?

          當(dāng)無法事先確定對象需要使用多少內(nèi)存(這些對象所需的內(nèi)存大小只有在程序運(yùn)行的時(shí)候才能確定)時(shí)就要申請動態(tài)內(nèi)存,比如維護(hù)一個(gè)動態(tài)增長的鏈表或樹。

          33.C++內(nèi)存泄漏和野指針怎么解決

          內(nèi)存泄漏:①訪問已經(jīng)釋放的內(nèi)存②訪問沒有權(quán)限的內(nèi)存。

          野指針:指向內(nèi)存被釋放的內(nèi)存或者沒有訪問權(quán)限的內(nèi)存的指針。

          野指針可以使用shared_ptr和weak_ptr結(jié)合使用來盡量規(guī)避,釋放內(nèi)存后把指針指向NULL,防止指針在后面不小心又被解引用了。

          內(nèi)存泄漏的解決:使用智能指針。因?yàn)橹悄苤羔樋梢宰詣觿h除分配的內(nèi)存。

          34.C++模板的作用

          模板(Template)指C++程序設(shè)計(jì)設(shè)計(jì)語言中采用類型作為參數(shù)的程序設(shè)計(jì),支持通用程序設(shè)計(jì)。通常有兩種形式:函數(shù)模板和類模板;

          python

          1.python is和==的區(qū)別

          is是用來判斷兩個(gè)變量引用的對象是否為同一個(gè),==用于判斷引用對象的值是否相等??梢酝ㄟ^id()函數(shù)查看引用對象的地址。

          2.list和tuple的區(qū)別?

          list是一種有序的集合,可以隨時(shí)添加和刪除其中的元素。tuple是一種有序列表,它和list非常相似。tuple一旦初始化就不能修改,而且沒有append() insert()這些方法,可以獲取元素但不能賦值變成另外的元素。

          不同點(diǎn):list是可更改的,所以,可以insert,pop等,但是tuple是不可更改的,所以沒有增減函數(shù),但是其余的查詢len(),index()等函數(shù)都是一樣的。

          3. Python里面的字典的key可以用list嗎?可以用tuple嗎?可以用set嗎?

          一個(gè)對象能不能作為字典的key,就取決于其有沒有__hash__方法。所以所有python自帶類型中,除了list、dict、set和內(nèi)部至少帶有上述三種類型之一的tuple之外,其余的對象都能當(dāng)key。

          4.講一下yield關(guān)鍵字?它的作用是啥?

          yield是一個(gè)常用于python函數(shù)定義中的關(guān)鍵字,它的作用是返回一個(gè)可以用來迭代(for循環(huán))的生成器,它的應(yīng)用場景通常為一個(gè)需要返回一系列值的,含有循環(huán)的函數(shù)中。

          5. python是解釋語言還是編譯語言

          python 是解釋型的編程語言

          6. xrange與range的區(qū)別

          xrange 用法與 range 完全相同,所不同的是生成的不是一個(gè)list對象,而是一個(gè)生成器。

          7. Python里面的lambda表達(dá)式寫一下,隨便寫一個(gè)

          定義一個(gè)lambda表達(dá)式,求三個(gè)數(shù)的和:

          8.Python里面的三元運(yùn)算符寫一下(x = 1 if x> y else 0)

          9.python和java是解釋語言還是編譯語言

          Java編譯性,python解釋性。

          10.Python字典采用的是什么數(shù)據(jù)結(jié)構(gòu)?(使用的是key-value匹配的哈希結(jié)構(gòu))

          11.Python的多線程能否用來做并行計(jì)算?(不能,它有GIL鎖,但可以用多進(jìn)程實(shí)現(xiàn)并行)

          12.Python中0.35/0.05等于多少?(python中/和//的區(qū)別)

          " / " 表示浮點(diǎn)數(shù)除法,返回浮點(diǎn)結(jié)果;

          " // " 表示整數(shù)除法,返回不大于結(jié)果的一個(gè)最大的整數(shù)

          13.python傳參會改變原值嗎

          當(dāng)我們傳的參數(shù)是int、字符串(string)、float、(數(shù)值型number)、元組(tuple) 時(shí),無論函數(shù)中對其做什么操作,都不會改變函數(shù)外這個(gè)參數(shù)的值;

          當(dāng)傳的是字典型(dictionary)、列表型(list)時(shí),如果是重新對其進(jìn)行賦值,則不會改變函數(shù)外參數(shù)的值,如果是對其進(jìn)行操作,則會改變。即變量中存儲的是引用 , 是指向真正內(nèi)容的內(nèi)存地址 , 對變量重新賦值 , 相當(dāng)于修改了變量副本存儲的內(nèi)存地址 , 而這時(shí)的變量已經(jīng)和函數(shù)體外的變量不是同一個(gè)了, 在函數(shù)體之外的變量 , 依舊存儲的是原本的內(nèi)存地址 , 其值自然沒有發(fā)生改變 。


          參考鏈接

          • https://www.cnblogs.com/luoqingyu/p/5972504.html

          • https://www.nowcoder.com/questionTerminal/a61ee26ed795464abd7aa3d0c4ffe9de?toCommentId=2704776

          • https://blog.csdn.net/zihonggege/article/details/104683593

          • https://blog.csdn.net/qq_34270874/article/details/113179820

          • https://zhuanlan.zhihu.com/p/55608388

          • https://blog.csdn.net/weixin_40004081/article/details/113067828

          • https://blog.csdn.net/u010366748/article/details/50792759

          • https://blog.csdn.net/github_37130188/article/details/109407048

          • https://zhuanlan.zhihu.com/p/37331092

          • https://blog.csdn.net/Fly_as_tadpole/article/details/96470356

          • https://blog.csdn.net/hyl1181/article/details/115821149

          • http://m.bubuko.com/infodetail-2720377.html

          • https://www.yalaniso.com/c/2eea3eff26ba1e72.html

          • https://www.cnblogs.com/zhidongjian/p/10413683.html

          • https://blog.csdn.net/jinking01/article/details/109514088

          • https://blog.csdn.net/wtzdedaima/article/details/78897285

          • https://blog.csdn.net/wolf_break/article/details/81335765

          • https://wapiknow.baidu.com/question/1774129696452864020/answer/3506592571.html?&mzl=qb_xg_2&fr=relate&word=&refer_title=C%E8%AF%AD%E8%A8%80%E5%92%8CPython%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%E5%91%A2%EF%BC%9F&

          • https://blog.csdn.net/qq_35212671/article/details/51920851

          • https://blog.csdn.net/everysigleday/article/details/92797688


          如果覺得有用,就請分享到朋友圈吧!

          △點(diǎn)擊卡片關(guān)注極市平臺,獲取最新CV干貨

          公眾號后臺回復(fù)“目標(biāo)檢測綜述”獲取綜述:目標(biāo)檢測二十年(2001-2021)


          極市干貨
          YOLO教程:一文讀懂YOLO V5 與 YOLO V4大盤點(diǎn)|YOLO 系目標(biāo)檢測算法總覽全面解析YOLO V4網(wǎng)絡(luò)結(jié)構(gòu)
          實(shí)操教程:PyTorch vs LibTorch:網(wǎng)絡(luò)推理速度誰更快?只用兩行代碼,我讓Transformer推理加速了50倍PyTorch AutoGrad C++層實(shí)現(xiàn)
          算法技巧(trick):深度學(xué)習(xí)訓(xùn)練tricks總結(jié)(有實(shí)驗(yàn)支撐)深度強(qiáng)化學(xué)習(xí)調(diào)參Tricks合集長尾識別中的Tricks匯總(AAAI2021
          最新CV競賽:2021 高通人工智能應(yīng)用創(chuàng)新大賽CVPR 2021 | Short-video Face Parsing Challenge3D人體目標(biāo)檢測與行為分析競賽開賽,獎池7萬+,數(shù)據(jù)集達(dá)16671張!


          CV技術(shù)社群邀請函 #

          △長按添加極市小助手
          添加極市小助手微信(ID : cvmart2)

          備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測-深圳)


          即可申請加入極市目標(biāo)檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學(xué)影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計(jì)/ReID/GAN/圖像增強(qiáng)/OCR/視頻理解等技術(shù)交流群


          每月大咖直播分享、真實(shí)項(xiàng)目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與 10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~



          覺得有用麻煩給個(gè)在看啦~  
          瀏覽 69
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色免费看视频 | 中文字幕在线免费播放 | 国产一级婬乱A片 | 亚洲一线在线观看 | 特级黄色录像国产 |