基本情況:秋招中,一些面試中,c/c++問題總結
重要問題說三次,面試前,一定一定一定要注意準備:
資料結構和演算法!
資料結構和演算法!
資料結構和演算法!
1、結構體對齊
答:結構體位元組對齊的細節和編譯器實現相關,但一般需要滿足三個基本原則:
1)結構體變數的首位址能夠被最寬基本型別的成員的大小所整除
2)結構體每個成員相對於結構體首位址的偏移量都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組
3)結構體的總大小為結構體最寬基本型別成員的整數倍。
2、結構體複製
答:c++裡面的話,將結構體視為類來處理。採用修改拷貝建構函式來實現深拷貝達到複製目的。
c的話,只能寫乙個單獨的函式來實現,開闢記憶體,釋放記憶體,兩者賦值函式。
3、strcpy有什麼缺陷
答:strcpy(出參,入參(原始引數)),該函式就是把入參拷貝到出參,如果出參所指的記憶體空間不夠大,會導致緩衝溢位的錯誤情況。
4、說出所有排序、快速排序思路、堆排思路
答:選擇排序、氣泡排序、插入排序、快速排序、希爾排序、桶排序
選擇排序:
這種排序方式比較容易理解,利用迴圈,每次找乙個元素放在它最終的位置上,比如先找到最小的元素,放在首位,然後再剩下的元素中找到最小的,依此類推,最終從小到大排好。
氣泡排序:
這是另一種常見的排序方式,通過對違反順序的相鄰元素進行調整以達成目標,假設需要從小到大進行排序,那麼每次迴圈都會從頭開始比較相鄰兩個元素的大小,小的放在前面,大的放在後面,一輪結束後,最大的元素(泡)便被「冒」到了最後。每次迴圈都是如此。在迴圈中可以加乙個終止條件:如果一輪下來後沒有過調整次序,那麼說明已經排序完畢,跳出迴圈即可。
插入排序:
顧名思義,是將新的元素插入到原來已經排列好的一組數中。在具體實現時,可以將陣列分為兩部分。第一部分是除最後一位的其它所有元素,並且給出乙個空間,使得可以讓第二部分中的待插入元素有位置;第二部分是待插入的元素。第一部分排完序後,操作第二部分。雖然插入排序和選擇排序的時間複雜度一樣,但是插入排序的第二重迴圈可以提前結束,不需要遍歷到開始位置。尤其是對於已經快要排列好的陣列。
快速排序:
快速排序是一種相當高效的演算法,主要採用的分治的思想方法。一次排序過後,確立乙個樞軸,放在某個位置,讓左邊的數都小於它,右邊的數都大於它。主要是搞清一輪探測到底要達成什麼目的,上下的只需要遞迴即可。取一左一右向中間慢慢移動,一旦發現有前大於後,就交換,知道兩者相碰,設定第乙個數作為樞軸,開始遞迴。
希爾排序:
希爾排序是在不相鄰的元素之間進行交換等操作。
桶排序:
顧名思義,我們需要放置桶,對於簡單的例子,可以按自然數依次放置,對於難以處理的大型資料,可以考慮「加大」桶放置的種類,使得乙個區間內的都可以放進來,再對其中的各個元素進行排序。
堆排思路:
堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序。將無需序列構建成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆; 將堆頂元素與末尾元素交換,將最大元素"沉"到陣列末端; 重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。
5、陣列和鍊錶區別
不同點:鍊錶是鏈式的儲存結構,通過指標連線元素與元素;陣列是連續的儲存結構,元素按照次序依次儲存,查詢比較簡單,插入刪除比較複雜。
相同點:兩種結構均可以實現資料的順序儲存,構造出來的模型呈線性結構。
6、什麼是雜湊衝突以及解決方式;雜湊表長度為什麼是質數
答:1)雜湊衝突原因,雜湊是通過對資料進行再壓縮,提高效率的一種方法。但是由於通過雜湊函式產生的雜湊值是有限的,而資料可能比較多,導致通過雜湊函式處理後仍然有不同的資料對應相同的值,這時候就產生了雜湊衝突。(資料量大,而雜湊函式產生的雜湊值有限,導致多對一衝突)
3)原因實在hash函式中,你要用這些質數做模運算(%),而分析發現,如果不是用質數來做模運算的話,會導致許多資料分布會集中在某些點上面,所以會選擇質數來做模的除數。正因為質數做模的除數,模完之後,資料會在0到所選質數之間,自然導致長度也為質數了。
7、malloc最大申請多少記憶體,底層實現原理是什麼
答:malloc中文名稱是動態記憶體分配,最大可以申請的記憶體為,除去系統核心使用的以外的記憶體,但一般稍微小一些。比如windows32位系統,4g記憶體,系統用了2g,那麼可以申請到的記憶體就是1.9g左右了。
實現原理是,linux的話,系統呼叫brk()函式或者mmap()函式來開闢記憶體空間的。
8、反轉字串中單詞順序
答:第一步,反轉所有的字母順序;第二部,根據空格或者,號為界,反轉單詞。最後,達到目的。
9、兩個字串找最大公共子串
答:簡單的思路就是迴圈查詢,先找出較短的字串並求出其長度,根據長度進行相應的迴圈,從大到小的方式來查詢。
10、n*n的格仔,放了m個地雷,如何讓每個格仔放的雷概率相等
答:需要乙個生成1-n的隨機數生成器,然後每次呼叫兩次生成x,y,作為地雷放置的位置,如果位置重複則捨棄,重複執行直到獲得m個位置。
11、強行轉換指標型別會導致什麼問題?
答:有可能記憶體型別解析不正確。比如16位系統中,int型別2位元組,float型別4位元組,int型別指標,會讀到2個位元組的記憶體空間內容;強行轉為float型別,會讀到4個位元組內容,而後面的兩位元組是什麼內容,我們不清楚,導致可能的問題發生。
12、printf有可能會存在什麼的弊端?
答:printf()函式維持乙個要列印的變數棧,引數從右到左入棧,連續的。當列印時候,printf根據字元轉換的說明如要求輸出%f型別就提取8位元組的資料,%d就提取4位元組資料,從低位址開始提取資料,直到所有引數列印完成;當然,它並不知道裡面放了多少個引數的。這過程,可以發現,printf()輸出時候,它並沒有進行邊界檢測的,只是根據輸出型別要求,強行讀取記憶體中的資料當作正常資料輸出,從而導致了堆溢位問題。
13、如何快速查詢陣列中第k個元素?
答:可以考慮選擇排序,氣泡排序,快速排序。
14、大頂堆、小頂堆區別是什麼?
答:大頂堆、小頂堆來自堆排序裡面的,堆屬於一種二叉樹維護的一維陣列結構,根據特點,可以把堆分為大頂堆和小頂堆。
大頂堆:每個結點的值都是大於或等於其左右孩子結點的值
小頂堆:每個結點的值都是小於或等於其左右孩子結點的值
15、結構體裡面,強行將4位元組型別,分配8位元組,會導致對齊出現什麼問題?
答:題外知識:為了提高cpu訪問記憶體的效率,cpu可能會在讀取資料時會一次性讀取4個位元組、或者2個位元組、或者8位元組等大小的資料,所以編譯器在把資料存放於記憶體時,會自動對齊。
而,結構體中,一般位元組對齊原則是以最大的成員佔據的空間大小對齊,也會遵循變數的佔據的空間大小依次對齊。
例如:乙個結構體,依次 char char int 根據最大的4位元組對齊,共佔據8位元組(對應前半句說明);
另乙個結構體,依次是,double short int short,先是8位元組對齊,然後是4位元組對齊,一共位元組數為20位元組(對應後半句說明)。
參考:以及其他網頁
######################
通過秋招這次歷練,發現,只是刷c/c++的基本語法這些題目是不行的(筆試階段很有用處),但也要十分注意資料結構和演算法的練習!
算是自己乙個教訓吧,自己方針出了問題,導致基本上一面過後就沒有下文了。
2021秋招備戰 MySQL面試相關知識
事務時訪問並可能更新資料庫中各種資料項的乙個程式執行單元。是乙個完整的業務邏輯單元事務不可以再分割 和事務相關的語句只有dml語句。資料庫主要分為五大模組 1.dql 資料查詢語言 凡是select語句都是 2.dml 資料操作語言 對錶內的資料進行增 刪 改 3.ddl 資料定義語言 庫和表的定義...
C C 秋 春招技術崗面試基礎 深淺拷貝
c 的拷貝方式 介紹了深淺拷貝的區別 先看一下下面的 c vc6.0 乙個person類,乙個建構函式 乙個析構函式 乙個char 成員變數,乙個 int成員變數。建構函式 len是字串的長度,然後為指標p分配記憶體空間,長度為len 1,1是為了字串末尾的 0,然後strcpy進行字串拷貝 析構函...
秋招面試常見問題 作業系統
一.作業系統 1.執行緒程序區別?2.程序通訊方式?2.1 管道pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2.2 命名管道fifo 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。2.3 訊息佇列m...