百度C++一面
1、分析一段程式碼,沒有提示從什麼角度要分析什麼,只是分析點越多越好
a=0.1;
b=0.3;
if(3*a==b)
{a+=b;}
else{a=a+b;}
要分a和b是否為基本型別來分析,基本型別能編譯過,如果不是基本型別則需要過載運算子。還問了a+=b;和a=a+b;有沒有區別
2、有沒有用過什麼設計模式
3、分析程式碼的輸出
#include<iostream> using namespace std; class A{ public: A(){}; ~A(){cout<<"A"<<endl;}; virtual void fun(){}; int a; }; class B{ public: B(){}; ~B(){cout<<"B"<<endl;}; virtual void fun(){}; char b; }; class C:public A,public B{ public: C(){}; ~C(){cout<<"C"<<endl;}; virtual void fun(){}; long c; }; int main(){ A* p=new C(); delete p; cout<<sizeof(C)<<endl; return 0; }
上機答案為:A,20
注意:不同的父類用不同的虛擬函式表,但父類和子類是同一個虛擬函式表。
4、寫一個頭檔案實現4個類:人,男人,女人,房子(human,man,woman,house)。man和woman是繼承關係,男人有配偶女人,女人也有配偶男人,人有房子,房子有主人。可以寫一個或者多個頭檔案,要求能編譯通過,要寫出include語句,寫清楚各類之間的關係。
5、實現一個函式,輸入為兩個ip地址,判斷是否在同一網段(第一節是否相同)
答:用string裝引數,比較前面三個字元是否相同
問:還有沒有更優化的方法?
6、實現一個類,類方法包括push(),pop(),max(),max()即找最大值。要求三者時間複雜度O(1)
(1)空間換時間:另開一個棧smax儲存當前最大值,即保持棧頂始終為當前最大值。每次push資料時與smax棧頂比較,資料<=棧頂就照常push,資料>棧頂就把資料也入棧到smax中。pop時與smax比較是否是當前最大值,如果是當前最大值則棧smax也要pop
(2)用一個變數儲存當前最大資料max,資料棧中儲存“差值”:push資料時,push(資料-max),比較資料與max,若資料>max則替換max為資料;pop資料時,若棧內資料為負,則pop(棧內資料+max),若棧內資料為正,則pop(max),同時用(max-棧內資料)替換max
7、記憶體棧和堆的區別
8、排序瞭解嗎?什麼是快排?冒泡呢?快排複雜度是多少?二者那個更快?為什麼快排比冒泡快?冒泡能用分治思想嗎?堆排序怎麼實現?
9、常用哪些容器?
10、有沒有什麼想問我的?
因為當時覺得自己答得很不好,過不了了,已經放棄掙扎,腦子已經停止思考,所以就說沒有什麼想問的。後來在回來的車上才覺得應該問一下面試過程中沒有解決的問題的,特別是那個用O(1)找max的演算法。
最後他給了些建議:我們這邊基本是從基礎、演算法、專案三個方面做考察,你的專案比較偏專業一點,但是對我們來說意義不大,因此建議你從前面兩個方面加強。
走的時候把他的筆帶走了,回去還的時候,他問了一句:有沒有興趣做測試開發?當時想都沒想就說沒學過測試,只是知道一點。然後他就無奈的笑了。我感覺他內心肯定覺得我沒救了。