1. 程式人生 > >百度C++一面

百度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的演算法。

最後他給了些建議:我們這邊基本是從基礎、演算法、專案三個方面做考察,你的專案比較偏專業一點,但是對我們來說意義不大,因此建議你從前面兩個方面加強。

走的時候把他的筆帶走了,回去還的時候,他問了一句:有沒有興趣做測試開發?當時想都沒想就說沒學過測試,只是知道一點。然後他就無奈的笑了。我感覺他內心肯定覺得我沒救了。