說(shuō)來(lái)慚愧皿曲,這是我第二次來(lái)這家公司面試了摩疑,如果沒(méi)記錯(cuò)的話上一次面試的時(shí)候是16年的5月份状勤。然而當(dāng)我到公司坐下來(lái)答筆試題的時(shí)候鞋怀,令我沒(méi)想到的是試題竟然還是一年以前的那一份。當(dāng)我答完筆試題見(jiàn)到面試官的時(shí)候持搜,令我更沒(méi)想到的是面試官竟然也是一年以前的那一位密似。與上次不同的是,這次答的不錯(cuò)葫盼。相同的是残腌,同樣沒(méi)有一個(gè)令我滿意的結(jié)果。這次被拒絕的理由是贫导,畢業(yè)一年半?yún)s沒(méi)有工作經(jīng)驗(yàn)抛猫,雖然我知道這不是真正的原因。
試題分為幾個(gè)部分孩灯,包括C++基礎(chǔ)闺金,指針,結(jié)構(gòu)體峰档,Linux基本指令败匹,編程題寨昙,以及包括數(shù)據(jù)庫(kù),python等附加題。
1.C++基礎(chǔ)
1.如何判定 float 型變量 x 大于 1
if(x > 1.0)
2. #ifndef,#define,#endif的作用
#ifndef
它是if not define 的簡(jiǎn)寫(xiě),是宏定義的一種政恍,實(shí)際上確切的說(shuō)笼才,這應(yīng)該是預(yù)處理功能三種(宏定義、文件包含绩郎、條件編譯)中的一種----條件編譯。
在c語(yǔ)言中,對(duì)同一個(gè)變量或者函數(shù)進(jìn)行多次聲明是不會(huì)報(bào)錯(cuò)的外里。所以如果h文件里只是進(jìn)行了聲明工作,即使不使用# ifndef宏定義特石,多個(gè)c文件包含同一個(gè)h文件也不會(huì)報(bào)錯(cuò)盅蝗。
但是在c++語(yǔ)言中,#ifdef的作用域只是在單個(gè)文件中姆蘸。所以如果h文件里定義了全局變量墩莫,即使采用#ifdef宏定義,多個(gè)c文件包含同一個(gè)h文件還是會(huì)出現(xiàn)全局變量重定義的錯(cuò)誤逞敷。
使用#ifndef可以避免下面這種錯(cuò)誤:如果在h文件中定義了全局變量狂秦,一個(gè)c文件包含同一個(gè)h文件多次,如果不加#ifndef宏定義推捐,會(huì)出現(xiàn)變量重復(fù)定義的錯(cuò)誤裂问;如果加了#ifndef,則不會(huì)出現(xiàn)這種錯(cuò)誤牛柒。
#ifndef 和 #endif 要一起使用堪簿,如果丟失#endif,可能會(huì)報(bào)錯(cuò)皮壁⊥指總結(jié)一下:在c語(yǔ)言中,對(duì)同一個(gè)變量或者函數(shù)進(jìn)行多次聲明是不會(huì)報(bào)錯(cuò)的蛾魄。所以如果h文件里只是進(jìn)行了聲明工作虑瀑,即使不使用# ifndef宏定義,一個(gè)c文件多次包含同一個(gè)h文件也不會(huì)報(bào)錯(cuò)滴须∩喙罚 使用#ifndef可以避免下面這種錯(cuò)誤:如果在h文件中定義了全局變量,一個(gè)c文件包含同一個(gè)h文件多次描馅,如果不加#ifndef宏定義把夸,會(huì)出現(xiàn)變量重復(fù)定義的錯(cuò)誤;如果加了#ifndef铭污,則不會(huì)出現(xiàn)這種錯(cuò)恋日。
3.指針的應(yīng)用
原題記不清了膀篮,牛客網(wǎng)上有一道類似的題
https://www.nowcoder.com/profile/1313996/myFollowings/detail/2175059
4.結(jié)構(gòu)體的大小
32位系統(tǒng)中下面結(jié)構(gòu)體的大小
struct A {
int a;
double b;
char c;
bool d;
};
由于32位系統(tǒng)下岂膳,每次最多分配4個(gè)字節(jié)誓竿,因此上述結(jié)構(gòu)體的大小為16字節(jié)
5.vector中resize()和reserve()的區(qū)別
http://www.programgo.com/article/51122819213/
6.vector中map和unorderedmap的區(qū)別
雖然都是map,但是內(nèi)部結(jié)構(gòu)大大的不同哎谈截,map的內(nèi)部結(jié)構(gòu)是R-B-tree來(lái)實(shí)現(xiàn)的筷屡,所以保證了一個(gè)穩(wěn)定的動(dòng)態(tài)操作時(shí)間,查詢簸喂、插入毙死、刪除都是O(logN),最壞和平均都是喻鳄。而unordered_map如前所述扼倘,是哈希表。順便提一下除呵,哈希表的查詢時(shí)間雖然是O(1)再菊,但是并不是unordered_map查詢時(shí)間一定比map短,因?yàn)閷?shí)際情況中還要考慮到數(shù)據(jù)量颜曾,而且unordered_map的hash函數(shù)的構(gòu)造速度也沒(méi)那么快纠拔,所以不能一概而論,應(yīng)該具體情況具體分析泛豪。
7.關(guān)于動(dòng)態(tài)聯(lián)編的
2.編程題
1.反轉(zhuǎn)字符串
char* ReverseString(char* input) {
if(input == NULL)
return NULL;
char* pBegin = input, *pEnd = input;
while(*pEnd != '\0')
++pEnd;
--pEnd;
Reverse(pBegin, pEnd);
pEnd = input;
while(*pBegin != '\0') {
if(*pBegin == ' ') {
pBegin = ++ pEnd;
}
else if (*pEnd == ' ' || *pEnd == '\0') {
Reverse(pBegin, --pEnd);
pBegin = ++pEnd;
}
else
++pEnd;
}
return input;
}
void Reverse(char* pBegin, char* pEnd) {
if(pBegin == NULL || pEnd == NULL)
return ;
while(pBegin < pEnd) {
char tmp = *pBegin;
*pBegin = *pEnd;
*pEnd = tmp;
++pBegin, --pEnd;
}
}
2.反轉(zhuǎn)單鏈表
struct ListNode {
int val;
ListNode *next;
};
ListNode* ReverseList(ListNode* pHead) {
if(pHead == NULL)
return pHead;
ListNode *pNode = pHead, pPrev = NULL, pReverseHead = NULL;
while(pNode) {
ListNode *pNext = pNode->next;
if(!pNext)
pReverseHead = pNode;
pNode->next = pPrev;
pPrev = pNode;
pNode = pNext;
}
return pReverseHead;
}
3.求圖中最短路徑稠诲,要求所有節(jié)點(diǎn)只經(jīng)過(guò)一次
3.Linux相關(guān)知識(shí)
1.常用命令的含義
cp, mv, rm, ls, ps, top, crontab
2. 編寫(xiě)shell腳本
主要考察grep
3.gcc編譯test.c為myTest可執(zhí)行程序的命令
gcc -o myTest test.c
4.附加題
包括數(shù)據(jù)庫(kù)查詢語(yǔ)句,Python基礎(chǔ)(貌似是lamba什么的候址,還有可變變量什么的)吕粹,常見(jiàn)的大數(shù)據(jù)算法有哪些种柑。